我想使用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或roqet都不接受多行SPARQL查询作为参数。任何查询 长于一行的行必须存储在一个文件中(例如," test1.rq"如上所述)。
更好的方法是直接在IPython 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}
或者至少要改进功能,使其至少需要一个 filename作为参数,如
turtleme('dcam.ttl', myquery)
我已经搜索了谷歌的热门歌曲,以了解使用带有SPARQL的IPython Notebook的例子 但没有找到。对于专为此设计的环境而言,这似乎是一个明显的用途 数据探索。我发现真正有效的唯一方法是运行 arq,但后来需要做
!cat test3.rq
将查询粘贴到IPython Notebook中,它完成了函数 记录探索数据的过程,但必须编辑所有查询 与笔记本平行,作为单独的文件。我的目标是成功 方便初学者使用SPARQL和记录探索RDF数据 他们在笔记本上的探索。必须有更好的方法!
更新:
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
如果我在第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
但是,我无法通过转义全部来执行整个命令 线的两端。
所以问题可能不在于arq和roqet如何在线处理查询 那些arq和roqet命令行如何传递给IPython Notebook?
答案 0 :(得分:1)
在IPython Notebook中,在带有bang(“!”)的shell命令之前会 适用于大多数命令(例如,“!date”),但如上所述,多行 命令未正确传递。根据 The cell magics in IPython
IPython有一个
%%script
单元格法术,可让你在一个单元格中运行一个单元格 系统上任何解释器的子进程,例如:bash,ruby, perl,zsh,R等它甚至可以是您自己的脚本 在stdin上输入。
要使用它,只需将路径或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 . }'
答案 1 :(得分:0)
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> |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------