我有一个用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
的资源。
答案 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;这只是序列化中必须能够引用它们的概念。