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