使用IPython Notebook(使用rdflib?)来记录SPARQL查询和结果

时间:2014-06-21 00:47:51

标签: sparql ipython-notebook rdflib

我想使用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数据 他们在笔记本上的探索。必须有更好的方法!

更新:

@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?

2 个答案:

答案 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> |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------