假设我们有this个问题的同一个树
A
,D
,E
和H
是属于类: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-D
,A-E
,E-H
)?我认为用结果集中的最小值过滤行就足够了。实际上,如果一个:Special
节点的:Special
后代处于不同高度(例如,distance({A-D
)= 1,distance(A-E
)= 2),则失败。>
可能我需要其他东西。
答案 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-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
此查询工作正常,即使在树变得很大时也无法很好地扩展。优化或不同的策略都是可能的。