tree - 用于折叠树分支的 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-E
)E-H
?我相信在我的结果集中过滤具有最小值的行就足够了。实际上,如果一个:Special
节点具有:Special
不同高度的后代(例如,距离(A-D
)= 1,距离(A-E
)= 2),则它会失败。
可能我需要一些不同的东西。
解决方案
根据评论中的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
这个查询工作正常,即使当树变得很大时它也不能很好地扩展。优化或不同的策略是可能的。
推荐阅读
- c++ - 为什么我只看到一种颜色?
- java - 如何返回第二个列表中不存在的第一个列表中的项目子列表?
- wordpress - 我必须如何为 CPT 使用模板层次结构?
- excel - EXCEL:向右拖动单元格时,我需要使用存储在列而不是行中的信息(不知道如何正确询问)
- python - 这似乎是正确的everywgere 但是我每次在 bin_bash 行都收到 IndexError 。但随着 puts 线运行良好
- c - 输入缓冲区得到一个输入,C编程
- php - 升级 laravel
- bash - 如何使回调示例在 bash 中运行?
- java - 是否可以直接从日历字段中获取时差?
- java - 对象 toString 方法和 Liskov 替换原理