在rdflib中执行SPARQL查询

2 投票
1 回答
1197 浏览
提问于 2025-04-18 13:28

我正在学习SPARQL,并且使用Python的rdflib库来练习。
我尝试了几次,但是每次用ASK查询时,结果总是返回True。
比如,我试了以下代码:

#!/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)

结果是True,即使在'try.ttl'文件中根本没有类型为false.com的主题。
有没有人能告诉我这是为什么呢?
提前感谢你的帮助!

更新:我在阅读rdflib的手册时发现,结果是一个列表(list),而且在我的情况下,它应该只包含一个布尔值,表示ASK查询的返回结果。
我尝试了以下代码:
for x in results:
print x
结果是“None”。
我在想,我可能没有正确使用查询方法。

1 个回答

5

这段文档并没有明确说结果是列表类型,但它提到你可以遍历这个结果,或者把它转换成布尔值(也就是真或假):

如果类型是“ASK”,那么遍历结果会得到一个布尔值(或者说用bool(result)也会返回同样的布尔值)

这意味着你用的 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

如果我们在文件中添加一些数据,使得查询返回真,那么结果就会是true:

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

你可能在用这个库的旧版本?或者用的是新版本但出现了bug?我现在用的是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'

撰写回答