SPARQL查询折叠的树的分支(概括拓扑)

时间:2018-07-09 17:21:01

标签: tree sparql rdf

假设我们有this个问题的同一个树

enter image description here

ADEH是属于类:Special的' 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 .

我想获得与起始树相同的树,但只有 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-DA-EE-H)?我认为用结果集中的最小值过滤行就足够了。实际上,如果一个:Special节点的:Special后代处于不同高度(例如,distance({A-D)= 1,distance(A-E)= 2),则失败。

可能我需要其他东西。

1 个答案:

答案 0 :(得分:1)

根据评论中的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-DA-EE-H

最后,外部查询使用:Special中间节点(即?mid)过滤出模式

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

最终结果集是用于创建此摘要树的<?node?end>对夫妇的集合:

  A
 _|_
|   |
E   D
|
H

此查询工作正常,即使在树变得很大时也无法很好地扩展。优化或不同的策略都是可能的。