在你的例子中,你需要从rdflib使用Python对象属性访问来表达前缀名--在你的例子中。
g = Graph()
FOAF = rdflib.Namespace("http://radlex.org/RID/")
patient = rdflib.term.URIRef("http://localhost/rdf/patient/")
n1 = Namespace("http://localhost/rdf/patient/")
g.add( (patient, FOAF.RID13159, n1.age) )
g.add( (patient, FOAF.RID13159, n1.name) )
g.add( (patient, FOAF.RID13159, n1.gender) )
g.add( (n1.name, FOAF.RID13160, Literal("Radha")))
g.add( (n1.age, FOAF.RID13163, Literal('21')))
g.add( (n1.gender,FOAF.RID13164, Literal("F")))
result = g.serialize(format='turtle')
qres = g.query(
"""SELECT ?Subject
WHERE {
?Subject FOAF.RID13163 "F".
}"""
)
这意味着
在Python中翻译为
ParseException Traceback (most recent call last)
<ipython-input-9-7aadbf996386> in <module>
24 WHERE {
25 ?Subject FOAF.RID13163 "F".
---> 26 }"""
27 )
28 # list( g.triples((None, FOAF.RID13160, None)) )
~\AppData\Local\Continuum\anaconda3\lib\site-packages\rdflib\graph.py in query(self, query_object, processor, result, initNs, initBindings, use_store_provided, **kwargs)
1087
1088 return result(processor.query(
-> 1089 query_object, initBindings, initNs, **kwargs))
1090
1091 def update(self, update_object, processor='sparql',
~\AppData\Local\Continuum\anaconda3\lib\site-packages\rdflib\plugins\sparql\processor.py in query(self, strOrQuery, initBindings, initNs, base, DEBUG)
72
73 if not isinstance(strOrQuery, Query):
---> 74 parsetree = parseQuery(strOrQuery)
75 query = translateQuery(parsetree, base, initNs)
76 else:
ParseException: Expected {SelectQuery | ConstructQuery | DescribeQuery | AskQuery} (at char 57), (line:3, col:21)
在SPARQL中。否则,rdflib就会抱怨它找不到有效的查询表单。
除此之外,还有一个原因是你的查询不会运行,即使你改变了命名空间前缀将不被查询识别。如果你添加了
在运行你的查询之前,你的查询就会运行。FOAF.RID13163
一旦你的查询运行,还有两件事我想指出。首先,我想你的意思是你在查询三联中的谓词是指 FOAF.RID13163
-- 将返回一个结果。第二, FOAF:RID13163
是rdflib的内置命名空间(
),指的是著名的Friend of a Friend词汇。我建议你用另一个名字(FOAF.RID13163
在你的情况下?),以免混淆其他可能需要使用你的代码的人。FOAF:RID13163
FOAF
g.bind("FOAF", FOAF)