Sparql - 返回递归深度

时间:2014-09-25 14:16:51

标签: rdf sparql owl

我已经使用递归进行了第一次查询,以搜索特定数字的所有子项:

SELECT distinct ?child
WHERE {
?child rdfs:subClassOf* num_108999. 
}

我想添加递归的深度,例如,如果我的数据如下所示:

108999 --> 2004 --> 218

我想要回报:

?child | ?depth
_______|_______
2004   | 1
218    | 2

为了使我可以使用" UNION"和elt {n}:

SELECT * WHERE {
{
    SELECT distinct (1 as ?count) ?child
    WHERE {
    ?child rdfs:subClassOf{1} num_108999. 
    }
}UNION{
    SELECT distinct (2 as ?count) ?child
    WHERE {
    ?child rdfs:subClassOf{2} num_108999. 
    }
}

我认为2深度可以,但在完整的数据中,我有20个深度...... 如何在自动增量变量中传递深度数?

谢谢!

更新: 我找到了一个小解决方案:将出现的elt {*}拆分为elt {+}和elt {*}。

SELECT distinct (count(?mid) as ?count) ?child
WHERE {
?mid rdfs:subClassOf+ num_108999. 
?child rdfs:subClassOf* ?mid. 
}

它可以与二叉树一起使用。但我没有二叉树,我的数据看起来像:

          /--> 2003 --\
108999 --/             \--> 218
         \---> 2004 --/

上一个查询计算每条路径:108999到2003,2003到218,108999到2004和2004到218。

因此返回值为4而不是2 ...

1 个答案:

答案 0 :(得分:0)

首先,请注意

?child rdfs:subClassOf{1} num_108999. 

不合法的SPARQL。 SPARQL 1.1没有包含属性路径的{m,n}说明符,尽管它在早期的草案中。但是,Virtuoso确实支持它。它的规范实际上允许你做

  {n} # exactly n
 {m,} # at least m
 {,n} # no more than n
{m,n} # at least m and no more than n

最后一种形式正是您想要的(如果您使用的是支持它的端点):

?child rdfs:subClassOf{1,2} num_108999

但这并不能帮助您找到特定路径的长度,而且您通常不能在SPARQL中执行此操作。如果从开始到结束只有一条路径,那么你可以,但如果有多条路径,你就不能。