在rdflib中查询ASAR SPARQL

时间:2014-07-15 22:03:47

标签: python 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手册,我发现结果是类型列表,并且(在我的情况下)应该包含一个带有ask查询返回值的布尔值。 我尝试了以下方法:     对于结果中的x:         打印x 我得到了“无”。 我猜我没有以正确的方式使用查询方法。

1 个答案:

答案 0 :(得分:4)

documentation实际上并不是说它是类型列表,但你可以迭代它,或者你可以将它转换为布尔值:

  

如果类型是“ASK”,迭代将产生一个bool(或   bool(结果)将返回相同的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

如果我们在文件中添加一些使查询返回true的数据,我们就会得到:

$ 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'