3

我尝试像这样查询数据库:

from rdflib import Graph, Literal, URIRef
from rdflib.namespace import RDF, SKOS
from rdflib.plugins.stores import sparqlstore


# define endpoint according to https://www.stardog.com/docs/
endpoint = 'http://path/to/query'  # http://<server>:<port>/{db}/query

# create store
store = sparqlstore.SPARQLUpdateStore()

# I only want to query
store.open(endpoint)
store.setCredentials('me', 'my_pw')

# What does this actually do? That runs through
default_graph = URIRef('some:stuff')
ng = Graph(store, identifier=default_graph)
# # If identifier is not defined, it crashes
# ng = Graph(store)

rq = """
SELECT ?foo ?bar 
WHERE {
  ?something a <http://path/to/data/.ttl#SomeValues>.
  ?something <http://path/to/data/.ttl#foo> ?foo.
  ?something <http://path/to/data/.ttl#bar> ?bar.                       
}
"""

query_res = ng.query(rq)
for s, l in query_res:
    print(s, l)

不幸的是,我目前没有得到任何结果:

<head><variable name="foo"></variable><variable name="bar"></variable></head><results></results></sparql>

我的问题是,identifierin 在Graph做什么,即这是否重要,如果重要,应该如何定义。当我没有定义它时,代码会崩溃:

响应:b'{"message":"在 URI 中找不到分隔符:N53e412e0f3a74d6eab7ed6da163463bf"}'

如果我输入任何其他有冒号或斜杠的内容,它就会运行(但查询仍然没有返回任何内容)。

谁能简要解释一下,应该放什么以及这是否可能是查询不成功的原因(查询命令本身是正确的;当我从另一个工具调用它时,它工作正常)?

4

1 回答 1

1

构造函数的identifier参数Graph允许识别 RDFLib 图。如果值为None,则使用空白节点作为标识符。

但是,如果store值为 a SPARQLUpdateStore,则该identifier值也用于default-graph-uriSPARQL 协议,因此不能是空白节点。

因此,问题是:远程三元存储中默认的“未命名”图的名称是什么?

来自Stardog 的文档

命名

Stardog 包括几个常用的命名图集的别名。这些非标准扩展是为了方便而提供的,可以在任何需要命名图形 IRI 的地方使用。这包括 SPARQL 查询和更新、属性图操作和配置值。以下是特殊命名图 IRI 的列表。

          Named Graph IRI                             Refers to                
--------------------------------  ---------------------------------------------
tag:stardog:api:context:default   the default (no) context graph              
tag:stardog:api:context:all       all contexts, including the default graph    
tag:stardog:api:context:named     all named graphs, excluding the default graph

我找不到任何私有 Stardog 端点的公共端点(似乎ABS的端点已关闭)。DBpedia 上的示例:

from rdflib import Graph, URIRef
from rdflib.plugins.stores import sparqlstore

store = sparqlstore.SPARQLUpdateStore()
store.open('http://dbpedia.org/sparql')

default_graph = URIRef('http://people.aifb.kit.edu/ath/#DBpedia_PageRank') 
ng = Graph(store, identifier=default_graph)

rq = """
    SELECT ?foo ?foobar {
      ?foo ?foobar ?bar                       
    } LIMIT 100
"""

query_res = ng.query(rq)
for s, l in query_res:
    print(s, l)

结果与应有的结果相似。即使在您的代码中,未命名图的名称也是唯一的问题,获得的结果是正确的SPARQL XML 结果


PS 可能你可以尝试而不是来达到你的目的。

于 2018-03-07T15:11:05.203 回答