在三元组中添加空白节点

时间:2011-09-15 18:01:29

标签: python rdf rdflib blank-nodes

下面写的代码给出了以下输出:

代码:

person = BNode()
dataStore.add((URIRef(stringrd),FOAF_NS['knows'],person))
dataStore.add((person,FOAF_NS['Person'],URIRef(fetchKnowsRowString)))
dataStore.add((person,TRUST_NS['hasValue'],Literal(trustString)))

输出:

<rdf:Description rdf:about="http://www.iamresearcher.com/profiles/id/luc.moreau">
  <foaf:knows rdf:nodeID="kdOAGjqG160"/>
</rdf:Description>

<rdf:Description rdf:nodeID="kdOAGjqG160">
  <t:data>1</t:data>
  <foaf:Person rdf:resource="http://www.iamresearcher.com/profiles/id/patrick.hayes"/>
  <foaf:Person rdf:resource="http://www.iamresearcher.com/profiles/id/christian.queinnec"/>
  <foaf:Person rdf:resource="http://www.iamresearcher.com/profiles/id/thanassis.tiropanis"/>
  <foaf:Person rdf:resource="http://www.iamresearcher.com/profiles/id/ian.foster"/>
  <foaf:Person rdf:resource="http://www.iamresearcher.com/profiles/id/nicholas.gibbins"/>
</rdf:Description>

但是我需要关注输出,请你指出它有什么问题。

<rdf:Description rdf:about="http://www.iamresearcher.com/profiles/id/luc.moreau">
<foaf:knows>
  <foaf:Person rdf:resource="http://www.iamresearcher.com/profiles/id/patrick.hayes">
    <t:data>1</t:data>
  </foaf:Person>
  <foaf:Person rdf:resource="http://www.iamresearcher.com/profiles/id/christian.queinnec">
    <t:data>1</t:data>
  </foaf:Person>
  <foaf:Person rdf:resource="http://www.iamresearcher.com/profiles/id/thanassis.tiropanis">
    <t:data>1</t:data>
  </foaf:Person>
  <foaf:Person rdf:resource="http://www.iamresearcher.com/profiles/id/ian.foster">
    <t:data>1</t:data>
  </foaf:Person>
  <foaf:Person rdf:resource="http://www.iamresearcher.com/profiles/id/nicholas.gibbins">
    <t:data>1</t:data>
  </foaf:Person>
</foaf:knows>
</rdf:Description>

提前致谢。

2 个答案:

答案 0 :(得分:0)

似乎你错误地在bNode person上循环。您使用的是相同的bNode,这可能是导致错误的原因。

所以如果您的代码看起来像......

person = BNode()
for (fetchKnowsRowString, trustString) in friends:
   dataStore.add((URIRef(stringrd),FOAF_NS['knows'],person))
   dataStore.add((person,FOAF_NS['Person'],URIRef(fetchKnowsRowString)))
   dataStore.add((person,TRUST_NS['hasValue'],Literal(trustString)))

然后错误是您正在使用相同的bNode实例。您的代码应该类似于下面的代码段。请注意,bNode创建在循环内部,这是主要区别。

for (fetchKnowsRowString, trustString) in friends:
   person = BNode()
   dataStore.add((URIRef(stringrd),FOAF_NS['knows'],person))
   dataStore.add((person,FOAF_NS['Person'],URIRef(fetchKnowsRowString)))
   dataStore.add((person,TRUST_NS['hasValue'],Literal(trustString)))

答案 1 :(得分:0)

你的问题在这里有点模糊,首先你想要的输出实际上是无效的RDF / XML,所以即使你想要也无法生成它。您是否尝试通过W3C RDF Validator运行它以及它究竟来自何处?

您是否有理由尝试生成适合特定模式的RDF / XML?

恕我直言,这是非常糟糕的做法,你真的不应该试着这样做 RDF的重点在于它是一个基于三元组的数据模型,它与数据的实际序列化是分开的。您应该永远不会尝试根据所需的序列化创建RDF,您应该创建表达数据的RDF三元组,这些三元组从您显示的最小代码段看起来就像您正在做的那样。

所以我再次重申,为什么需要以特定的方式生成RDF / XML?假设你有这样的理由可能有更好的方法来实现你的实际目标,如果你提供更多的细节,人们将有更好的机会能够适当地帮助你