2011-04-11 53 views

回答

3

我认为是什么你正在寻找的是将一个上下文附加到图上。这就像创建一个图表解析其中的子图一样,每个子图都有一个名字 - 在rdflib的情况下为URIRef

想象一下,你必须通过下面的两个文件中显示图表:

dataA.nt

<http://data.org/inst1> <http://xmlns.com/foaf/0.1/name> "david" . 
<http://data.org/inst2> <http://xmlns.com/foaf/0.1/name> "luis" . 
<http://data.org/inst3> <http://xmlns.com/foaf/0.1/name> "max" . 

dataB.nt

<http://data.org/inst1> <http://xmlns.com/foaf/0.1/knows> <http://data.org/inst2> . 
<http://data.org/inst2> <http://xmlns.com/foaf/0.1/knows> <http://data.org/inst3> . 
<http://data.org/inst3> <http://xmlns.com/foaf/0.1/knows> <http://data.org/inst1> . 

而下面的一段代码:

import rdflib 

g = rdflib.ConjunctiveGraph("IOMemory",) 

#g is made of two sub-graphs or triples gathered in two different contexts. 
#the second paramaters identifies the URIRef for each subgraph. 
g.parse("dataA.nt",rdflib.URIRef("http://mygraphs.org/names"),format="n3") 
g.parse("dataB.nt",rdflib.URIRef("http://mygraphs.org/relations"),format="n3") 

print "traverse all contexts and all triples for each context" 
for subgraph in g.contexts(): 
    print "Graph name",subgraph.identifier 
    for triple in subgraph.triples((None,None,None)): 
     print triple 

print "traverse all contexts where a triple appears" 
for subgraph in g.contexts(triple=(rdflib.URIRef('http://data.org/inst1'),rdflib.URIRef("http://xmlns.com/foaf/0.1/name"),rdflib.Literal(u'david'))): 
    print "Graph name",subgraph.identifier 
    for triple in subgraph.triples((None,None,None)): 
     print triple 

print "traverse a triple pattern regardless the context is in" 
for t in g.triples((None,rdflib.URIRef("http://xmlns.com/foaf/0.1/name"),None)): 
    print t