使用IPython笔记本(带rdflib?)记录SPARQL查询和结果

使用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查询作为参数。任何疑问 超

我想使用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查询作为参数。任何疑问 超过一行的长度必须存储在一个文件中(例如,如上所述的“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 . }'