2014-07-15 38 views
2

我想學習SPARQL,我正在使用python的rdflib進行培訓。 我已經做了幾次嘗試,但任何ASK查詢似乎總是給我一個真正的結果。 例如,我試過如下:ASK SPARQL查詢在rdflib

#!/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 results in: print x 而且我得到了「無」。 我猜我沒有以正確的方式使用查詢方法。

+0

您使用的是什麼版本的rdflib? –

回答

4

documentation實際上並沒有說,這是類型列表中,但你可以遍歷它,或者你可以將其轉換爲一個布爾值:

如果類型是「問」,集合將會產生一個布爾(或 布爾(結果)將返回相同的布爾)

這意味着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' 
+0

這是我的問題!我查了一下,我的rdflib版本很舊(2.1版,而新版本是4.2)。 非常感謝! – user3523375