Не позволяйте EasyRDF вкладывать ресурсы

У меня есть график RDF, который я создаю с помощью EasyRDF:

<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:dc="http://purl.org/dc/terms/"
         xmlns:foaf="http://xmlns.com/foaf/0.1/"

  <rdf:Description rdf:about="http://the-query-url">
    <dc:creator>me</dc:creator>
    <foaf:primaryTopic rdf:resource="genid1">
  </rdf:Description>

  <rdf:Description rdf:nodeID="genid1">
    <!-- stuff -->
  </rdf:Description>
</rdf:RDF>

Вышеприведенное неверно - ссылка на пустой узел в foaf:primaryTopic должна быть _:genid1.

Когда я меняю эту строку на

$meta_block->add('foaf:primaryTopic', $graph->resource('_:' . $symbol_block->getBNodeId()));

EasyRdf вкладывает ресурсы следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:dc="http://purl.org/dc/terms/"
         xmlns:foaf="http://xmlns.com/foaf/0.1/"

  <rdf:Description rdf:about="http://the-query-url">
    <dc:creator>me</dc:creator>
    <foaf:primaryTopic>
      <rdf:Description>
        <!-- stuff -->
      </rdf:Description>
    </foaf:primaryTopic>
  </rdf:Description>
</rdf:RDF>

Как запретить EasyRdf вкладывать узлы? Я хочу, чтобы вывод был таким же, как в первом примере, только с _:genid1 в качестве ресурса для foaf:primaryTopic.


person reggie    schedule 02.11.2015    source источник


Ответы (1)


Возможно, вы неправильно понимаете модель данных RDF. Пустые узлы на самом деле пусты. Хотя может быть что-то вроде пустого идентификатора узла в конкретной сериализации или с данным API, на самом деле он не является частью модели данных. В первом показанном фрагменте узел с идентификатором genid nodeId является объектом тройки foaf:primaryTopic. То же самое и во втором фрагменте; есть тройка foaf:primaryTopic, а объект представляет собой пустой узел. Вы получаете тот же RDF-контент. Это может быть легче увидеть, если вы сериализуете в более удобном для человека формате, таком как Turtle или N-Triples. Для получения дополнительной информации об этой проблеме вы можете найти обсуждение в Как получить доступ к документам OWL с помощью XPath в Java? полезно.

Все это говорит о том, что вы, вероятно, можете настроить, как easyRDF записывает RDF/XML. Это не библиотека, которую я использовал, но вы можете посмотреть, можно ли отключить синтаксические сокращения. Например, с помощью Jena (библиотека Java) вы можете указать, что хотите использовать "RDF/XML" или "RDF/XML-ABBREV". RDF/XML-ABBREV больше похож на ваш второй фрагмент, тогда как похоже, что вы хотите что-то более похожее на RDF/XML. Но опять же, я предлагаю вам попробовать сериализовать в такой формат, как N-Triples или Turtle, чтобы увидеть, что содержимое RDF на самом деле такое же. RDF не имеет пустых идентификаторов узлов; это просто концепция сериализации, которая должна иметь возможность ссылаться на них.

person Joshua Taylor    schedule 05.11.2015