0

我想使用 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?

4

2 回答 2

1

在 IPython Notebook 中,在 shell 命令前加上一个 bang(“!”)将适用于大多数命令(例如,“!date”),但如上所述,多行命令不能正确传递。根据 IPython 中的细胞魔法

IPython 有一个%%script单元格魔法,它可以让您在系统上任何解释器的子进程中运行单元格,例如:bash、ruby、perl、zsh、R 等。

它甚至可以是您自己的脚本,它需要在标准输入上输入。

要使用它,只需将路径或 shell 命令传递给您要运行的程序就%%script行了,该单元格的其余部分将由该脚本运行,并捕获并显示来自子进程的 stdout/err。

%%script bash因此,要正确传递查询,IPython Notebook 单元格必须以(或仅)开头 %%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 . }'
于 2014-06-21T16:58:12.247 回答
0

Both sparql/arq and roqet can accept multiline queries; you just need to quote them appropriately. Here's an example:

$ 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> |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
于 2014-06-21T13:40:24.927 回答