通用SPARQL查询:获取多主体共享的谓词与对象
查询被多个主体共享的谓词与对象
现有RDF图(Turtle格式)
@prefix : <http://example.org/> . :JupiterAtmsphere :isComposedOf :Nitrogen. :JupiterAtmsphere :isComposedOf :Helium. :EarthAtmosphere :isComposedOf :Nitrogen. :comet_1 :hasDiscoverer :JohnSmith. :comet_5 :hasDiscoverer :JohnSmith. :comet_3 :hasDiscoverer :JaneLee.
需求说明
需要编写通用SPARQL查询,不用提前知晓图中的主体、谓词或对象,适配不同本体词汇,返回所有被多个主体共享的谓词与对象——也就是回答「哪些主体共享同一对象?」。
预期返回结果:
- :Nitrogen被:JupiterAtmsphere与:EarthAtmosphere共享
- :JohnSmith被:comet_1与:comet_5共享
尝试的无效查询
SELECT ?class1 ?class2 ?p1 ?o WHERE { ?class1 ?p1 ?o. ?class2 ?p2 ?o. FILTER (?p1 = ?p2) }
问题分析与正确查询
原查询存在三个问题:
- 未限制两个主体必须不同,会出现
?class1和?class2为同一资源的无效结果 - 没必要拆分谓词变量再过滤相等,直接复用同一个谓词变量更简洁
- 会返回重复配对(比如
?class1=:JupiterAtmsphere, ?class2=:EarthAtmosphere和?class1=:EarthAtmosphere, ?class2=:JupiterAtmsphere属于冗余结果)
正确的SPARQL查询如下:
SELECT ?subject1 ?subject2 ?predicate ?object WHERE { ?subject1 ?predicate ?object. ?subject2 ?predicate ?object. # 确保两个主体为不同资源 FILTER (?subject1 != ?subject2) # 避免重复配对,只保留主体URI按字典序排序的组合 FILTER (?subject1 < ?subject2) }
该查询会精准返回所有符合要求的共享对象及对应的主体、谓词,完全匹配预期需求。
内容的提问来源于stack exchange,提问作者Samah K
相关产品推荐
相关产品推荐

