Sparql中的属性路径

时间:2017-04-12 08:39:36

标签: sparql rdf

我正在使用属性路径向Dbpedia端点提出Sparql查询:

select (COUNT(distinct ?s2) AS ?count) WHERE{
?s2 skos:broader{0,2} dbc:Countries_in_Europe
}

我想在没有属性路径的情况下提出相同的查询:

select (COUNT(distinct ?s2) AS ?count) (COUNT(distinct ?s1) AS ?count1)  WHERE{
?s2 skos:broader dbc:Countries_in_Europe.
?s1 skos:broader ?s2.
}

我有两个问题:

  1. 第二次查询是否可以获得?s1 +?s2?
  2. 对于第二个查询,我希望计数数字+1(dbc:Countries_in_Europe)的总和应该与第一个查询相同。但他们不是。有什么问题?
  3. 提前致谢。

1 个答案:

答案 0 :(得分:1)

  1. 您使用非标准SPARQL,即限制深度未达到最终版本,请参阅the W3C specs

  2. 我猜第一个查询应该返回给定的子类别到深度2,对吧?您的第二个查询不会这样做。你必须使用每个距离的UNION,即一个用于直接子类别,一个用于其他级别。

  3.  
        SELECT (COUNT(distinct ?s) AS ?count) WHERE {
    
        {
         ?s skos:broader dbc:Countries_in_Europe 
        } UNION {
         ?s1 skos:broader dbc:Countries_in_Europe.
         ?s skos:broader ?s1
        }  
    
        }
    

    注意,在您的第一个查询中,您使用了{0,2},这意味着由于0距离,类别dbc:Countries_in_Europe本身也是结果的一部分。如果需要,您应该将+1添加到第二个查询的结果中。

    更新

    根据@JohuaTaylor的评论,更简洁的语法将是

    SELECT (COUNT(distinct ?s) AS ?count) WHERE {
      ?s skos:broader/skos:broader? dbc:Countries_in_Europe 
    }