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



我想使用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和roet都不接受多行SPARQL查询作为参数。任何查询长于一行代码的代码必须存储在文件中(例如,"test1")。

在ippython 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中,实现了记录探索数据的过程,但查询必须全部编辑与笔记本平行,作为单独的文件。我的目标就是成功初学者很容易使用SPARQL探索RDF数据并进行记录他们在笔记本上的探索。一定有更好的办法!

更新:

@Joshua Taylor, @ andy指出这些命令接受多行查询作为参数。这在bash提示符下工作得很好,但不幸的是不是在ippython 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

如果我转义第一行的行尾,如

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

但是,我不能通过转义all来执行整个命令

所以问题可能不在于arq和roqet如何处理内联查询,而在于如何将这些arq和roqet命令行传递给IPython Notebook?

在IPython Notebook中,在shell命令前加上bang("!")将会适用于大多数命令(例如,"!date"),但如上所述,适用于多行命令命令传递不正确。根据python

中的单元格魔法

IPython有一个%%script cell魔法,它允许你在系统上任何解释器的子进程,例如:bash, ruby,perl, zsh, R等

它甚至可以是您自己的脚本,它期望

要使用它,只需将一个路径或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 . }'

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

最新更新