我需要制定一个SPARQL查询,该查询返回给定属性具有给定数量值的所有实体。例如,我希望所有国家都与其他两个国家接壤。
我也想找到所有不与任何其他国家接壤的国家(因此,属性“hasBorderWith”的值的数量等于零。在这种情况下,我不清楚是否有以下两种情况之间存在差异:
例如,我可以想象一个与其他国家没有边界的国家没有“hasBorderWith”属性。它会引起问题吗?
答案 0 :(得分:3)
这里有几个问题。要查找仅由两个国家/地区接壤的国家/地区,您需要按国家/地区匹配进行分组并获取计数。然后使用HAVING
,在计算聚合后按照计数条件过滤后执行{<1}}:
SELECT ?country (count(?bordered) AS ?borderCount)
WHERE {
?country a :Country .
?country :hasBorderWith ?bordered
} GROUP BY ?country
HAVING (?borderCount = 2)
对于第二个问题,我没有看到0和没有属性之间的区别,这可以通过否定查询来计算:
SELECT ?country
WHERE {
?country a :Country .
FILTER NOT EXISTS {
?country :hasBorderWith ?x
}
}
编辑:查找计数0
根据问题和@ ASKW的建议,如果没有hasBorderWith
属性,则以下将得到0:
SELECT ?country (count(?bordered) AS ?borderCount)
WHERE {
?country a :Country .
OPTIONAL {
?country :hasBorderWith ?bordered
}
} GROUP BY ?country
HAVING (?borderCount = 0)
OPTIONAL
子句允许匹配发生,但如果count(?bordered)
未绑定,则不会对?bordered
聚合做出贡献,因此:Country
的成员没有:hasBorderWith
1}}属性将获得0的计数。