我想使用 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}
或者,至少,改进函数,使其至少采用一个文件名作为参数,如
turtleme('dcam.ttl', myquery)
我在 Google 上搜索了将 IPython Notebook 与 SPARQL 结合使用的示例,但没有找到。对于为数据探索而设计的环境,这似乎是一个明显的用途。我发现真正有效的唯一方法是运行 arq,但随后需要这样做
!cat test3.rq
将查询粘贴到 IPython Notebook 中,它实现了记录探索数据过程的功能,但查询必须与 notebook 并行编辑,作为单独的文件。我的目标是让初学者更容易使用 SPARQL 探索 RDF 数据,并将他们的探索记录在笔记本中。一定会有更好的办法!
更新:
@Joshua Taylor,@AndyS 指出这些命令接受多行查询作为参数。这在 bash 提示符下可以正常工作,但不幸的是在 IPython 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
如果我在第 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?