使用IPython笔记本(带rdflib?)记录SPARQL查询和结果
我想使用IPython笔记本一起记录SPARQL查询 这些查询的结果 因为任何命令行工具都可以从IPython笔记本调用 “砰”的一声,我当然可以跑:使用IPython笔记本(带rdflib?)记录SPARQL查询和结果,sparql,ipython-notebook,rdflib,Sparql,Ipython Notebook,Rdflib,我想使用IPython笔记本一起记录SPARQL查询 这些查询的结果 因为任何命令行工具都可以从IPython笔记本调用 “砰”的一声,我当然可以跑: !arq --data dcterms.ttl --query test1.rq 或者使用roqet,我甚至可以在命令本身中嵌入一个简短的查询: !roqet -i sparql -e ’SELECT * WHERE { ?s ?p ?o }’ -D dcterms.rdf arq或roqet都不接受多行SPARQL查询作为参数。任何疑问 超
!arq --data dcterms.ttl --query test1.rq
或者使用roqet,我甚至可以在命令本身中嵌入一个简短的查询:
!roqet -i sparql -e ’SELECT * WHERE { ?s ?p ?o }’ -D dcterms.rdf
arq或roqet都不接受多行SPARQL查询作为参数。任何疑问
超过一行的长度必须存储在一个文件中(例如,如上所述的“test1.rq”)
最好是直接在IPython笔记本中定义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 .
我在谷歌搜索了使用IPython笔记本和SPARQL的例子
但是找不到。这似乎是一个明显的环境设计用途
数据探索。我发现唯一有效的方法就是运行
arq,但我们需要这样做
!cat test3.rq
将查询粘贴到IPython笔记本,实现
记录探索数据的过程,但查询必须在
与笔记本平行,作为单独的文件。我的目标是成功
初学者使用SPARQL和record轻松探索RDF数据
他们的探索记录在笔记本上。一定有更好的办法
更新:
@Joshua Taylor,@AndyS指出,这些命令接受多行查询
作为论据。这在bash提示符下可以正常工作,但不幸的是不能
在IPython笔记本中,它抛出一个语法错误:
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
[5]中的:!arq—数据dcam.ttl'
前缀rdf:
前缀dcam:
前缀rdfs:
选择s?p?o,其中{s?p?o.}'
Out[5]:文件“”,第2行
前缀rdf:
^
SyntaxError:无效语法
如果我逃出第1行的末尾,如
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
[5]中的:!arq—数据dcam.ttl'\
...
Out[5]:文件“”,第2行
前缀dcam:
^
SyntaxError:无效语法
但是,我无法通过转义所有
线的两端
因此,问题可能不在于arq和roqet如何在线处理查询,而在于
如何将这些arq和roqet命令行传递给IPython笔记本?sparql/arq和roqet都可以接受多行查询;你只需要适当地引用它们。下面是一个例子:
$ cat data.n3
@prefix : <http://stackoverflow.com/q/24337235/1281433/> .
:sparql :accepts :multiLineQueries.
:roqet :accepts :multiLineQueries.
$cat data.n3
@前缀:。
:sparql:accepts:multilequiries。
:roqet:accepts:multilequeries。
$roqet-D data.n3-e'
选择s?p?o何处{
?s?p?o
}'
roqet:正在运行查询'
选择s?p?o何处{
?s?p?o
}'
roqet:查询具有变量绑定结果
结果:[s=uri,p=uri,o=uri]
结果:[s=uri,p=uri,o=uri]
roqet:查询返回了2个结果
$sparql--data.n3'
选择s?p?o何处{
?s?p?o
}'
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|s|p|o|
=================================================================================================================================================================================
| | | |
| | | |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在IPython笔记本中,在shell命令前面加上“砰”(!)将
适用于大多数命令(例如“!date”),但如上所述,多行
命令传递不正确。根据
IPython有一个%%脚本
cell magic,可以让您在
系统上任何解释器的子进程,例如:bash、ruby、,
perl、zsh、R等
它甚至可以是您自己的脚本
输入标准输入
要使用它,只需向
要在%%script
行和单元格的其余部分上运行的程序
将由该脚本运行,并且子流程中的stdout/err是
捕获并显示
因此,要正确地传递查询,IPython笔记本单元必须以
%%script bash
(或仅%%bash
),如下所示:
[5]中的:%%脚本bash
arq—数据dcam.ttl'
前缀rdf:
前缀dcam:
前缀rdfs:
构造
其中{s rdf:type?o.}'
roqet可以使用-e
接受多行查询。有关示例,请参见。因为它接受多行查询,并且您可以在命令行上指定数据文件,所以它似乎可以处理所有事情?当您说您正在寻找一种至少能够turtleme('dcam.ttl',myquery)
的方法时,您是说def turtleme(path,query)…g.parse(path)…g.query(query)…
doesnt't work?arq接受对命令的查询,如(不使用--file)和多行查询(这是对!行的引用问题,而不是命令本身)。@AndyS我认为是这样的,但在--help
输出中没有看到它的选项,这表示用法是查询--data=--query=
。啊,但是arq
的输出是没有查询字符串或查询文件
,并且arq'select*{…}'
是预期的。所以arq/sparql也可以接受多行查询。@JoshuaTaylor-感谢您指出arq和roqet可以将多行查询作为命令行参数。这在bash中有效,但在IPython笔记本中不起作用(请参见上面添加的详细信息)。因此,也许问题真的与外部shell命令如何从IPython笔记本传递到shell有关?知道arq可以接受多行SPARQL查询非常好
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
$ 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> |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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 . }'