首页 > 解决方案 > 用于折叠树分支的 SPARQL 查询(总结拓扑)

问题描述

假设我们有这个问题的相同树

在此处输入图像描述

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 .

我想获得与起始树相同的树,但只有特殊节点。一种对起始拓扑的总结。例如,预期输出:

  A
 _|_
|   |
E   D
|
H

我想通过 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

通过这种方式,我得到了树中每对特殊节点的距离。

我怎样才能过滤超子关系(即A-D,,,,A-EE-H?我相信在我的结果集中过滤具有最小值的行就足够了。实际上,如果一个:Special节点具有:Special不同高度的后代(例如,距离(A-D)= 1,距离(A-E)= 2),则它会失败。

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

标签: treesparqlrdf

解决方案


根据评论中的AKSW线索推理,可能的解决方案可能是这个:

@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 .
        }
    }
}

解释:

最里面的查询:Special从根节点(即:orgA)返回所有节点。

select * where { 
    :orgA :hasSuborganization* ?node .
    ?node a :Special .
}

然后,外部查询选择所有可能的?node :hasSuborganization+ ?end模式。例如,对于?node=:orgA我们得到:A-D, A-E, E-H.

最后,外部查询过滤掉带有:Special中间节点(即?mid)的模式

FILTER NOT EXISTS {
    ?node :hasSuborganization+ ?mid .
    ?mid :hasSuborganization+ ?end .
    ?mid a :Special .
}

最终结果集是用于构建此汇总树的 < ?node, > 对的集合:?end

  A
 _|_
|   |
E   D
|
H

这个查询工作正常,即使当树变得很大时它也不能很好地扩展。优化或不同的策略是可能的。


推荐阅读