SPARQL存在量词否定查询异常:未返回预期无结果
问题:筛选仅存在close匹配的组件
输入RDF数据
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix : <urn:schema#> . <urn:data/EntryComponent/component1> a <urn:schema#EntryComponent> ; rdfs:label "geologic maps" . <urn:data/MatchRecord/record1> a :MatchRecord ; :hasComponent <urn:data/EntryComponent/component1> ; :matchType <urn:data/exact> . <urn:data/MatchRecord/record2> a :MatchRecord ; :hasComponent <urn:data/EntryComponent/component1> ; :matchType <urn:data/exact> . <urn:data/MatchRecord/record3> a :MatchRecord ; :hasComponent <urn:data/EntryComponent/component1> ; :matchType <urn:data/close> . <urn:data/MatchRecord/record4> a :MatchRecord ; :hasComponent <urn:data/EntryComponent/component1> ; :matchType <urn:data/close> .
需求与问题
需要查询不存在任何exact匹配、仅存在close匹配的组件。当前输入数据中,component1既有exact匹配也有close匹配,所以预期查询无结果。但使用以下SPARQL查询时,实际返回了record3和record4,不符合预期。
原错误SPARQL查询
PREFIX : <urn:schema#> SELECT * WHERE { ?component a :EntryComponent . ?record a :MatchRecord . FILTER NOT EXISTS { ?record :hasComponent ?component ; :matchType <urn:data/exact> . } }
问题原因
原查询逻辑错误:它是找到每个组件和每个匹配记录,只要这条记录本身不是该组件的exact匹配就返回,但我们要的是整个组件完全没有任何exact匹配记录,而非筛选单个非exact的记录。
修正后的SPARQL查询
PREFIX : <urn:schema#> SELECT ?component WHERE { # 锁定存在至少一条close匹配的组件 ?closeRecord a :MatchRecord ; :hasComponent ?component ; :matchType <urn:data/close> . # 排除掉存在任何exact匹配记录的组件 FILTER NOT EXISTS { ?exactRecord a :MatchRecord ; :hasComponent ?component ; :matchType <urn:data/exact> . } # 对组件去重,避免多条close记录重复返回同一组件 } GROUP BY ?component
说明
修正后的查询先筛选出有close匹配的组件,再通过NOT EXISTS排除掉存在exact匹配的组件,最终得到的就是仅存在close匹配的组件。针对当前输入数据,component1存在exact匹配,所以查询会返回空结果,符合预期。
内容的提问来源于stack exchange,提问作者tat
相关产品推荐
相关产品推荐

