"图形"中的"标识符"有什么作用?



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

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>

我的问题是,Graphidentifier在做什么,即这是否重要,如果是,应该如何定义它。当我不定义它时,代码崩溃并显示:

响应: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来达到你的目的。

相关内容

  • 没有找到相关文章

最新更新