我尝试像这样查询数据库:
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>
我的问题是,Graph
identifier
在做什么,即这是否重要,如果是,应该如何定义它。当我不定义它时,代码崩溃并显示:
响应:b'{"消息":"在 URI 中找不到分隔符: N53e412e0f3a74d6eab7ed6da163463bf"}'
如果我输入任何其他带有冒号或斜杠的内容,它会通过(但查询仍然不返回任何内容)。
谁能简要解释一下,应该放什么,这是否可能是查询失败的原因(查询命令本身是正确的;当我从另一个工具调用它时,它工作正常)?
Graph
构造函数的identifier
参数允许标识RDFLib图。如果值为None
,则使用空白节点作为标识符。
但是,如果store
值是SPARQLUpdateStore
,那么identifier
值也用作SPARQL协议的default-graph-uri
,因此不能是空节点。
因此,问题是:远程三元组中默认的"未命名"图的名称是什么?
来自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 结果。
附言:也许你可以尝试用sparqlwrapper代替rdflib来达到你的目的。