0

我有一个用 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.

4

1 回答 1

1

您可能误解了 RDF 数据模型。空白节点实际上是空白的。虽然在特定序列化或给定 API 中可能有类似空白节点 ID 的东西,但它实际上并不是数据模型的一部分。在您显示的第一个片段中,具有 genid nodeId 的节点foaf:primaryTopic 三元组的对象。第二个片段也一样;有一个 foaf:primaryTopic 三元组,对象是一个空白节点。您将获得相同的RDF 内容。如果您以更易于阅读的格式(如 Turtle 或 N-Triples)进行序列化,这可能更容易查看。有关此问题的更多信息,您可以在如何使用 Java 中的 XPath 访问 OWL 文档中找到一些讨论?有用。

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

于 2015-11-05T02:33:46.113 回答