Для этого не нужно указывать корневой узел.Этот запрос:
SELECT ?BodyPart ?PartOf
WHERE {
?S rdfs:label ?BodyPart;
k_anatomy:has_parent [ rdfs:label ?PartOf ].
}
добьется цели.
Я просто запустил его на локальной консоли RDF4J.Вывод:
Evaluating SPARQL query...
+-------------------------------------+-------------------------------------+
| BodyPart | PartOf |
+-------------------------------------+-------------------------------------+
| "Finger" | "Hand" |
| "Hand" | "Free Upper Limb" |
| "Free Upper Limb" | "Upper Limb" |
| "Upper Limb" | "Limb" |
| "Limb" | "Body_by_region" |
| "Body_by_region" | "Body" |
+-------------------------------------+-------------------------------------+
6 result(s) (36 ms)
Одно предостережение: порядок решений здесь произвольный, просто он точно совпадает с ожидаемыми результатами, потому что механизм RDF4J в этом случае просто выплевывает результаты в том порядке, в которомони произошли в исходном файле - но это не обязательно случится каждый раз, и, конечно, не во всех реализациях триплетов.
Обновление , если ваше хранилище содержит больше данных, чем только предоставленный вами входной файл,затем, чтобы получить желаемый результат, вам понадобится немного более сложный запрос.В частности, вам нужно будет использовать так называемое выражение " property path ".Это позволяет вам указать, что вы хотите, чтобы пути произвольной длины начинались с определенной точки.Например:
SELECT ?BodyPart ?PartOf
WHERE {
k_anatomy:K393 k_anatomy:has_parent* ?S .
?S rdfs:label ?BodyPart;
k_anatomy:has_parent [ rdfs:label ?PartOf ].
}
Вам все еще нужны части тела с их родителями (поэтому последняя часть запроса идентична исходному запросу), но теперь мы добавляем дополнительное ограничение посредством пути свойства кскажем, что значения для ?S
должны быть через путь нулевой длины или более связаны с K393
через отношение has_parent
.
Результат:
Evaluating SPARQL query...
+-------------------------------------+-------------------------------------+
| BodyPart | PartOf |
+-------------------------------------+-------------------------------------+
| "Hand" | "Free Upper Limb" |
| "Free Upper Limb" | "Upper Limb" |
| "Upper Limb" | "Limb" |
| "Limb" | "Body_by_region" |
| "Body_by_region" | "Body" |
+-------------------------------------+-------------------------------------+
5 result(s) (6 ms)
Как видите, в результате в списке не отображается «Палец», как ожидалось - хотя, конечно, это будет работать должным образом, только если отношения has_parent
не образуйте цикл.