如何使用Python确定两个SPARQL查询是否相同?

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

使用SPARQL查询RDF数据集时,可以用许多不同的方式编写相同的查询。例如,相对于其中的某些子句,sparql查询始终是排列不变的。同样,我们可以在sparql查询中重命名变量。但是,我们如何识别那些相同的SPARQL查询呢?理想情况下,应该有一个可以将sparql查询(即字符串对象)解析为查询对象的python包,并且将共享同一基础查询的不同字符串解析为同一对象,然后我们可以简单地比较解析后的查询对象确定两个sparql查询是否相同。是否有这样的工具(似乎prepareQuery()中的rdflib不能以这种方式工作)?如果没有,那我该怎么办?

语义上相同的查询示例:

SELECT ?x WHERE { ?x foaf:haha ?k .\n ?person foaf:knows ?x .}
SELECT ?s WHERE { ?person foaf:knows ?s .\n ?s foaf:haha ?k .}
sparql semantic-web
1个回答
0
投票

论文"Generating SPARQL Query Containment Benchmarks using the SQCFramework" by Muhammad Seleem et al.,提到“ SPARQL查询包含求解器”,其中

查询包含是确定是否包含查询Q1的结果集的问题在另一个查询的结果集中Q2

如果使用这样的求解器来测试Q1的结果集是否是Q2的子集,反之亦然,则已经确定它们在语义上是相同的。

关于您的“现成工具”:前一篇论文提到这些已在另一篇论文中进行了测试"Evaluating and benchmarking sparql query containment solvers." by M.W. Chekol et al..

关于复杂性和可计算性,后一论文提到:

完整SPARQL的查询包含问题无法确定[15,1]。因此,有必要减少SPARQL以便对其进行考虑。一种双重约束指数上限已被证明适用于没有OPTIONAL,FILTER和SPARQL查询的等价问题在设定的语义下[7]。

但是,双向查询约束只是确定查询身份的一种方法。我不知道是否有证据表明查询身份比查询包含更好的复杂性/可计算性。

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