如何获取没有给定属性的所有实体?

时间:2016-04-01 14:40:55

标签: sparql

我需要制定一个SPARQL查询,该查询返回给定属性具有给定数量值的所有实体。例如,我希望所有国家都与其他两个国家接壤。

我也想找到所有不与任何其他国家接壤的国家(因此,属性“hasBorderWith”的值的数量等于零。在这种情况下,我不清楚是否有以下两种情况之间存在差异:

  1. 实体的给定属性值为零。
  2. 实体没有给定的实体。
  3. 例如,我可以想象一个与其他国家没有边界的国家没有“hasBorderWith”属性。它会引起问题吗?

1 个答案:

答案 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的计数。