У меня есть дерево, которое я бы хотел пройти транзитивно.
Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть родительское понятие:
parentConcept -> hierRelationship1 -> child -> hierRelationship2 ->
-> grandChild -> hierelationship3 -> greatGrandChild -> hierelationship2 -> greatGreatGrandChild
Так что в основном у меня есть несколько иерархических отношений которые смешивают иерархию. Я знаю, что у всех прямых потомков parentConcept есть отношения skos:broader
- это внуки +, где вещи становятся волосатыми.
То, что я до сих пор пробовал, это:
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?child
WHERE {
?rel rdfs:subPropertyOf skos:broader . # get subPropertyOf rels
?child skos:broader <parentConcept> .
?grandchild ?rel ?child
}
В идеале я хотел бы «распаковать» мою переменную? Rel, чтобы я мог добавить транзитивный оператор (+) к каждому отношению в этой переменной, но я не уверен, возможно ли это в sparql.
Кто-нибудь видите лучший способ сделать это, или я на правильном пути?
Я также пытался включить OPTIONAL {} запросы, например, OPTIONAL {grandchild2 ?rel grandchild}
, но это очень медленно и кажется громоздким