ParseException:应为{SelectQuery | ConstructQuery | DescribeQuery | AskQuery}(在字符57处),(第3行,第21列)

2024-04-25 10:22:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用RDFlib执行一个简单的SPARQL查询。 我已经使用Radlex本体创建了一个RDF图,并尝试在图中进行查询 '''

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". 
               }"""
          )

'''

我得到了这个错误

 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)

我不明白这个错误是什么意思


Tags: inaddhttpresultqueryprocessorrdflibsubject
1条回答
网友
1楼 · 发布于 2024-04-25 10:22:11

错误是它无法识别语法正确的查询表单

在您的例子中,您需要从rdflib使用Python对象属性访问来表示前缀名称(在您的示例中)FOAF.RID13163映射到SPARQL使用冒号表示前缀名称的表示法。这意味着Python中的FOAF.RID13163转换为SPARQL中的FOAF:RID13163。否则,rdflib会抱怨找不到有效的查询表单

除此之外,即使将FOAF.RID13163更改为FOAF:RID13163,查询也不会运行的另一个原因是FOAF名称空间前缀不会被查询识别。如果在运行查询之前添加行g.bind("FOAF", FOAF),则查询将运行

一旦您的查询运行,我还想指出另外两件事。首先,我认为您的意思是查询三元组中的谓词为FOAF:RID13164,将返回一个结果。第二,FOAF是rdflib(from rdflib.namespace import FOAF)的内置名称空间,并引用朋友词汇表中众所周知的朋友。我建议您使用另一个名称(RID在您的情况下?),以免混淆可能需要使用您的代码的其他人

相关问题 更多 >