我正在使用属性路径向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.
}
我有两个问题:
提前致谢。
答案 0 :(得分:1)
您使用非标准SPARQL,即限制深度未达到最终版本,请参阅the W3C specs
我猜第一个查询应该返回给定的子类别到深度2,对吧?您的第二个查询不会这样做。你必须使用每个距离的UNION,即一个用于直接子类别,一个用于其他级别。
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
}