我想使用IPython Notebook一起记录SPARQL查询
因为任何命令行工具都可以从IPython Notebook调用随着"bang"的一声,我当然可以运行:
!arq --data dcterms.ttl --query test1.rq
或者使用roqet,我甚至可以在命令本身中嵌入一个简短的查询:
!roqet -i sparql -e ’SELECT * WHERE { ?s ?p ?o }’ -D dcterms.rdf
arq和roet都不接受多行SPARQL查询作为参数。任何查询长于一行代码的代码必须存储在文件中(例如,"test1")。
在ippython Notebook中直接定义SPARQL查询要好得多细胞,在那里它们可以很容易地被克隆和调整。以下作品:
In [4]: myquery = """
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
CONSTRUCT
WHERE {?s rdf:type ?o}
"""
In [5]: def turtleme(myquery):
import rdflib
g = rdflib.Graph()
g.parse('dcam.rdf')
results = g.query(myquery)
print results.serialize(format="turtle")
In [6]: turtleme(myquery)
Out [6]: @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<http://purl.org/dc/dcam/VocabularyEncodingScheme> a rdfs:Class .
<http://purl.org/dc/dcam/memberOf> a rdf:Property .
但是,我没有看到传递指定数据的SPARQL查询的方法要查询的源,例如:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
CONSTRUCT
FROM <dcterms.ttl>
FROM <dcam.ttl>
WHERE {?s rdf:type ?o}
,或者至少改进函数,使其至少需要一个文件名作为参数,如
turtleme('dcam.ttl', myquery)
我在Google上搜索了使用IPython Notebook和SPARQL的例子但是没有找到。对于一个为…设计的环境来说,这似乎是一个显而易见的用途数据探索。我发现唯一有效的方法就是跑步Arq,然后需要做
!cat test3.rq
将查询粘贴到IPython Notebook中,实现了记录探索数据的过程,但查询必须全部编辑与笔记本平行,作为单独的文件。我的目标就是成功初学者很容易使用SPARQL探索RDF数据并进行记录他们在笔记本上的探索。一定有更好的办法!
更新:@Joshua Taylor, @ andy指出这些命令接受多行查询作为参数。这在bash提示符下工作得很好,但不幸的是不是在ippython Notebook中抛出SyntaxError:
In [5]: !arq --data dcam.ttl '
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dcam: <http://purl.org/dc/dcam/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?s ?p ?o WHERE { ?s ?p ?o . }'
Out [5]: File "<ipython-input-5-c9328c1c0c64>", line 2
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
^
SyntaxError: invalid syntax
如果我转义第一行的行尾,如
In [5]: !arq --data dcam.ttl '
...
Out [5]: File "<ipython-input-18-313c556abc1d>", line 2
PREFIX dcam: <http://purl.org/dc/dcam/>
^
SyntaxError: invalid syntax
但是,我不能通过转义all来执行整个命令
所以问题可能不在于arq和roqet如何处理内联查询,而在于如何将这些arq和roqet命令行传递给IPython Notebook?
在IPython Notebook中,在shell命令前加上bang("!")将会适用于大多数命令(例如,"!date"),但如上所述,适用于多行命令命令传递不正确。根据python
中的单元格魔法IPython有一个
%%script
cell魔法,它允许你在系统上任何解释器的子进程,例如:bash, ruby,perl, zsh, R等它甚至可以是您自己的脚本,它期望
要使用它,只需将一个路径或shell命令传递给您希望在%%script
行上运行的程序,以及单元格的其余部分将由该脚本运行,并且子进程中的stdout/err是捕获并显示
因此,要正确传递查询,IPython Notebook单元格必须以%%script bash
(或只是%%bash
),如:
In [5]: %%script bash
arq --data dcam.ttl '
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dcam: <http://purl.org/dc/dcam/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
CONSTRUCT
WHERE { ?s rdf:type ?o . }'
sparql/arq和roqet都可以接受多行查询;你只需要适当地引用它们。下面是一个例子:
$ cat data.n3
@prefix : <http://stackoverflow.com/q/24337235/1281433/> .
:sparql :accepts :multiLineQueries.
:roqet :accepts :multiLineQueries.
$ roqet -D data.n3 -e '
select ?s ?p ?o where {
?s ?p ?o
}'
roqet: Running query '
select ?s ?p ?o where {
?s ?p ?o
}'
roqet: Query has a variable bindings result
result: [s=uri<http://stackoverflow.com/q/24337235/1281433/sparql>, p=uri<http://stackoverflow.com/q/24337235/1281433/accepts>, o=uri<http://stackoverflow.com/q/24337235/1281433/multiLineQueries>]
result: [s=uri<http://stackoverflow.com/q/24337235/1281433/roqet>, p=uri<http://stackoverflow.com/q/24337235/1281433/accepts>, o=uri<http://stackoverflow.com/q/24337235/1281433/multiLineQueries>]
roqet: Query returned 2 results
$ sparql --data data.n3 '
select ?s ?p ?o where {
?s ?p ?o
}'
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| s | p | o |
=================================================================================================================================================================================
| <http://stackoverflow.com/q/24337235/1281433/roqet> | <http://stackoverflow.com/q/24337235/1281433/accepts> | <http://stackoverflow.com/q/24337235/1281433/multiLineQueries> |
| <http://stackoverflow.com/q/24337235/1281433/sparql> | <http://stackoverflow.com/q/24337235/1281433/accepts> | <http://stackoverflow.com/q/24337235/1281433/multiLineQueries> |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------