停止EasyRDF嵌套资源

时间:2015-11-02 12:37:54

标签: php xml rdf blank-nodes easyrdf

我有一个用EasyRDF创建的RDF图:

<?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的资源。

1 个答案:

答案 0 :(得分:1)

您可能误解了RDF数据模型。空白节点实际上是空白的。尽管可能在特定序列化或具有给定API的情况下具有空白节点id,但它实际上不是数据模型的一部分。在您显示的第一个代码段中,genid为nodeId 的节点是 foaf:primaryTopic三元组的对象。它在第二个片段中也是一样的;有一个foaf:primaryTopic三元组,对象是一个空白节点。您正在获取相同的 RDF内容。如果您以更易读的格式(如Turtle或N-Triples)进行序列化,则可能更容易看到。有关此问题的更多信息,您可能会发现How to access OWL documents using XPath in Java?中的一些讨论很有用。

所有这一切,你可能可以定制easyRDF如何编写RDF / XML。它不是我使用的库,但您可能会查看是否可以关闭语法缩写。例如,使用Jena(Java库),您可以指定您想要&#34; RDF / XML&#34;或者&#34; RDF / XML-ABBREV&#34;。 RDF / XML-ABBREV更像是你的第二个片段,而你看起来想要更像RDF / XML的东西。但同样,我建议您尝试序列化为N-Triples或Turtle等格式,以查看RDF内容实际上是相同的。 RDF没有任何空白节点id;这只是序列化中必须能够引用它们的概念。