我已经使用递归进行了第一次查询,以搜索特定数字的所有子项:
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 ...
答案 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中执行此操作。如果从开始到结束只有一条路径,那么你可以,但如果有多条路径,你就不能。