【发布时间】:2020-09-27 17:43:27
【问题描述】:
我有以下示例数据:
@prefix hr: <http://ex.com/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sch: <http://schema.org/> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
hr:AAAA a rdfs:Class .
hr:BBBB a rdfs:Class .
hr:ClassA a rdfs:Class ;
rdfs:subClassOf hr:AAAA ;
rdfs:subClassOf hr:BBBB .
hr:ClassB a rdfs:Class ;
rdfs:subClassOf hr:ClassA .
hr:ClassC a rdfs:Class ;
rdfs:subClassOf hr:ClassB .
hr:ClassD a rdfs:Class ;
rdfs:subClassOf hr:AAAA .
hr:ClassE a rdfs:Class ;
rdfs:subClassOf hr:ClassD .
我想作为一系列字符串获得的是从一个节点到另一个节点的完整 rdfs:subClassOf 属性路径。在这种情况下,我想要返回的字符串集看起来像或类似于:
hr:ClassC -> hr:ClassB -> hr:ClassA -> hr:AAAA
hr:ClassC -> hr:ClassB -> hr:ClassA -> hr:BBBB
hr:ClassB -> hr:ClassA -> hr:AAAA
hr:ClassB -> hr:ClassA -> hr:BBBB
hr:ClassA -> hr:AAAA
hr:ClassA -> hr:BBBB
hr:ClassD -> hr:AAAA
hr:ClassE -> hr:ClassD -> hr:AAAA
SPARQL 可以做到这一点吗?如果是这样,查询会是什么样子?
以下查询似乎很接近:
SELECT ( GROUP_CONCAT( ?subclass; SEPARATOR = " -> " ) AS ?hierarchy )
WHERE {
?class rdfs:subClassOf+ ?subclass .
}
GROUP BY ?class
但结果是:
http://ex.com/AAAA
http://ex.com/AAAA -> http://ex.com/BBBB
http://ex.com/ClassA -> http://ex.com/AAAA -> http://ex.com/BBBB
http://ex.com/ClassB -> http://ex.com/ClassA -> http://ex.com/AAAA -> http://ex.com/BBBB
http://ex.com/ClassD -> http://ex.com/AAAA
我无法解释在哪里:
http://ex.com/AAAA -> http://ex.com/BBBB
来自或为什么结果中缺少 hr:ClassE。
【问题讨论】:
-
使用 SPARQL 不可能实现您想要的。你能得到的最接近的是 Joshua 的答案:stackoverflow.com/questions/18024413/… - 但这不能转换为你的
group_concat函数,仅仅是因为group_concat的结果没有以你期望的方式排序 -
我想一种可能的选择是有一个外部循环,逐渐增加
?class rdfs:subClassOf ?subclass到?class rdfs:subClassOf/rdfs:subClassOf ?subclass到?class rdfs:subClassOf/rdfs:subClassOf/rdfs:subClassOf ?subclass等等,直到没有返回结果。 -
stardog.com/docs/#_path_queries_2。我记得,
PATH查询仅在 Studio 中有效。