Tree 用于折叠树分支的SPARQL查询(汇总拓扑)

Tree 用于折叠树分支的SPARQL查询(汇总拓扑),tree,sparql,rdf,Tree,Sparql,Rdf,假设我们有相同的问题树 A、D、E和H是属于类:special的“特殊”节点。这是树的定义 @prefix : <http://example.org#> . :orgA :hasSuborganization :orgB, :orgC, :orgD. :orgB :hasSuborganization :orgE, :orgF. :orgE :hasSuborganization :orgG. :orgG :hasSuborganization :orgH. :orgA a :

假设我们有相同的问题树

A
D
E
H
是属于类
:special
的“特殊”节点。这是树的定义

@prefix : <http://example.org#> .

:orgA :hasSuborganization :orgB, :orgC, :orgD.
:orgB :hasSuborganization :orgE, :orgF.
:orgE :hasSuborganization :orgG.
:orgG :hasSuborganization :orgH.
:orgA a :Special .
:orgD a :Special .
:orgE a :Special .
:orgH a :Special .
我想通过SPARQL查询得到这个结果。我的出发点是:

@prefix : <http://example.org#> .

select ?node ?node2 (count(?mid) as ?distance) where {
    ?node :hasSuborganization* ?mid .
    ?mid :hasSuborganization+ ?node2 .
    ?node2 a :Special .
    {
        select * where { 
            <http://example.org#orgA> :hasSuborganization* ?node .
            ?node a :Special .
        }
    }
} group by ?node ?node2
@前缀:。
选择节点2(计算(?中间)作为距离),其中{
?节点:hasSuborganization*?mid。
?mid:hasSuborganization+?节点2。
?节点2 a:特殊。
{
选择*其中{
:hasSuborganization*?节点。
?节点a:特殊。
}
}
}按节点分组节点2
通过这种方式,我得到树中每对特殊节点的距离

如何仅过滤超级子关系(即,
A-D
A-e
e-H
)?我相信在结果集中用最小值过滤行就足够了。实际上,如果一个
:Special
节点在不同高度(例如,距离(
A-D
)=1,距离(
A-e
)=2)具有
:Special
子体,则该操作失败

可能我需要一些不同的东西。

根据评论中的线索,一个可能的解决方案可能是:

@prefix : <http://example.org#> .

select * where {
    ?node :hasSuborganization+ ?end .
    ?end  a :Special .
    FILTER NOT EXISTS {
        ?node :hasSuborganization+ ?mid .
        ?mid :hasSuborganization+ ?end .
        ?mid a :Special .
    }
    {
        select * where { 
            :orgA :hasSuborganization* ?node .
            ?node a :Special .
        }
    }
}
然后,外部查询选择所有可能的
?节点:hasSuborganization+?end
模式。例如,对于
?节点
=
:orgA
我们得到:
A-D
A-E
E-H

最后,外部查询用一个
:特殊的
中间节点(即
?mid
)过滤掉模式

最终结果集是用于构建此汇总树的夫妇的集合:

  A
 _|_
|   |
E   D
|
H

这个查询工作得很好,即使当树变大时它的伸缩性不是很好。优化或不同的策略是可能的。

SPARQL 1.1支持通过
过滤器不存在的方式进行否定。
-您可以尝试至少获取树的根节点和叶节点。我不确定是否理解您的提示。我的问题的最里面的查询已经返回root和leaves。我面临的问题是在它们之间建立正确的关系:)我们谈论的是同一个问题吗?为什么最内部的查询应该返回叶节点?叶节点是否没有子节点?您的查询只返回属于
A
的子组织(传递)的节点,此外,还返回属于
特殊类型的节点。但如果我错了,请纠正我。你是对的。我猜对“叶子”这个词有一个语义上的误解(我用错了。我将在帖子中澄清它)。我最里面的查询只返回我希望在摘要树中看到的节点集合。然而,我不知道如何获得汇总树的完整拓扑。
select * where { 
    :orgA :hasSuborganization* ?node .
    ?node a :Special .
}
FILTER NOT EXISTS {
    ?node :hasSuborganization+ ?mid .
    ?mid :hasSuborganization+ ?end .
    ?mid a :Special .
}
  A
 _|_
|   |
E   D
|
H