ParseException: Ожидается {SelectQuery | ConstructQuery | DescribeQuery | AskQuery} (символ 57), (строка: 3, столбец: 21) - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь выполнить простой запрос SPARQL, используя RDFlib. Я создал график RDF с использованием онтологии Radlex, и я пытаюсь запросить в графе '' '

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)

Не понимаю, что означает эта ошибка

1 Ответ

0 голосов
/ 07 мая 2020

Ошибка говорит о том, что он не распознает синтаксически правильную форму запроса.

В вашем случае вам необходимо сопоставить использование rdflib доступа к атрибуту объекта Python для выражения имен с префиксом - в ваш пример, FOAF.RID13163 - в нотацию SPARQL для имен с префиксом, в которой используется двоеточие. Это означает, что FOAF.RID13163 в Python переводится в FOAF:RID13163 в SPARQL. В противном случае rdflib жалуется, что не может найти действительную форму запроса.

Помимо этого, есть еще одна причина, по которой ваш запрос не будет выполняться, даже если вы измените FOAF.RID13163 на FOAF:RID13163: пространство имен FOAF префикс не будет распознан запросом. Если вы добавите строку g.bind("FOAF", FOAF) перед выполнением запроса, ваш запрос будет выполнен.

После выполнения вашего запроса есть еще две вещи, на которые я хотел бы обратить внимание. Во-первых, я думаю, вы имеете в виду, чтобы ваш предикат в тройке запроса был FOAF:RID13164 - это вернет один результат. Во-вторых, FOAF - это встроенное пространство имен для rdflib (from rdflib.namespace import FOAF), которое относится к хорошо известному словарю «Друг друга». Я предлагаю вам использовать другое имя (RID в вашем случае?), Чтобы не сбивать с толку других, которым может понадобиться работать с вашим кодом.

...