GraphDB 工作台与 SPARQLWrapper 中的构造查询结果不同

问题描述 投票:0回答:1

我正在尝试使用 API 从我的 GraphDB 存储库下载一些命名图。简而言之,我想以选择的序列化(Turtle 和 JSON-LD)检索命名图的全部内容。

我的第一种方法是使用构造查询:

PREFIX ex: <http://example.com/ns#>
CONSTRUCT {?s ?p ?o}
WHERE {graph <http://example.com/ns#id/>
{?s ?p ?o .}}

我在这里使用 python SPARQLWrapper,它返回结果,只有这些结果包含来自我所有图表的三元组,而不仅仅是 http://example.com/ns#id/。此外,如果我添加某种过滤器,例如过滤器(?o =“weafsdghadifhilaerjgak”),我仍然得到相同的结果(所有图形中的所有三元组),让我认为查询实际上并未运行。

我尝试打开一个新的笔记本,查询变量不会受到污染,但我仍然得到相同的结果。

在 GraphDB 工作台中运行查询会给出预期结果。寻找有关 GraphDB 工作台结果与 SPARQLWrapper 结果之间为何存在差异的指示

这是我正在使用的代码,为了安全起见,删除了一些细节:

from SPARQLWrapper import SPARQLWrapper, BASIC, QueryResult
from rdflib import Graph

db = SPARQLWrapper("myendpoint:7300/repositories/myrepo/statements")
query = '''
PREFIX ex: <http://example.com/ns#>
CONSTRUCT {?s ?p ?o}
WHERE {graph <http://example.com/ns#id/>
{?s ?p ?o .
#filter (?o = "somestringthatdefinitelydoesnotexist")
}}

'''
db.setHTTPAuth(BASIC)
db.setCredentials('my', 'credentials')
db.setQuery(query)
db.method = "GET"
db.setReturnFormat('json-ld')
db.queryType = "CONSTRUCT"
result = db.query()

jsonresult=(result._convertJSONLD())

# v = jsonresult.serialize(format='json-ld')
v = jsonresult.serialize(format='turtle')
print(query)
print(v)
sparql graphdb sparqlwrapper
1个回答
0
投票

使用 SPARQLWrapper 时,GET 查询的端点 URL 的结构必须如下:

myendpoint:port/repositories/{repositoryID} 

对于 POST 查询(更新、插入),端点不同:

myendpoint:port/repositories/{repositoryID}/statements 

通过在 POST“端点 url”上运行 GET 查询将导致检索所有三元组,无论您附加什么查询。这也是为什么我的过滤器对查询结果没有任何影响。

在我看来,这是一个愚蠢的复杂性:毕竟,GraphDB 工作台本身会解析您的查询,确定它是 GET 还是 POST 情况,并很好地处理 api。

TL:DR 仅在执行 POST 查询(SPARQL 插入)时使用 /statements。

这在 GraphDB 的 REST API 文档中有所描述,但尚不清楚在端点上运行错误“类型”的查询不会给出错误,而只是返回存储库中的所有语句。

© www.soinside.com 2019 - 2024. All rights reserved.