ЗАПРОСИТЬ SPARQL-запросы в rdflib

Я пытаюсь изучить SPARQL и использую для обучения python rdflib. Я сделал несколько попыток, но любой запрос ASK всегда, кажется, возвращает мне истинный результат. Например, я пробовал следующее:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import rdflib
mygraph=rdflib.Graph();
mygraph.parse('try.ttl',format='n3');
results=mygraph.query("""
ASK {?p1 a <http://false.com>}
 """)
print bool(results)

Результат верен, даже если в try.ttl нет темы типа false.com. Кто-нибудь может мне объяснить, почему? Заранее спасибо за вашу помощь!

ОБНОВЛЕНИЕ: читая руководство по rdflib, я обнаружил, что результаты относятся к списку типов и (в моем случае) должны содержать одно логическое значение с возвращаемым значением из запроса запроса. Я пробовал следующее: for x in results: print x И я получил «Нет». Полагаю, я неправильно использую метод запроса.


person user3523375    schedule 15.07.2014    source источник
comment
Какую версию rdflib вы используете?   -  person Joshua Taylor    schedule 16.07.2014


Ответы (1)


В документации фактически не говорится, что это списка типов, но вы можете перебирать его или преобразовывать в логическое значение:

Если типом является "ASK", итерация даст единственный логический тип (или bool (результат) вернет тот же самый логический тип).

Это означает, что print bool(results), как вы это сделали, должно работать. Фактически, ваш код действительно у меня работает:

$ touch try.ttl
$ cat try.ttl # it's empty
$ cat test.py # same code
#!/usr/bin/python
# -*- coding: utf-8 -*-
import rdflib
mygraph=rdflib.Graph();
mygraph.parse('try.ttl',format='n3');
results=mygraph.query("""
ASK {?p1 a <http://false.com>}
 """)
print bool(results)
$ ./test.py # the data is empty, so there's no match
False

Если мы добавим в файл некоторые данные, которые вернут истину запроса, мы получим истину:

$ cat > try.ttl 
<http://example.org> a <http://false.com> .
$ cat try.ttl 
<http://example.org> a <http://false.com> .
$ ./test.py 
True

Может быть, вы используете старую версию библиотеки? Или более новая версия и была внесена ошибка? Я использую 4.0.1:

$ python
Python 2.7.3 (default, Feb 27 2014, 19:58:35) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pkg_resources
>>> pkg_resources.get_distribution("rdflib").version
'4.0.1'
person Joshua Taylor    schedule 15.07.2014
comment
Это была моя проблема! Я проверил, и моя версия rdflib была очень старой (2.1, а новая версия - 4.2). Большое тебе спасибо! - person user3523375; 16.07.2014