SPARQL-запрос, чтобы пройти путь от данного корня - PullRequest
0 голосов
/ 11 декабря 2018

Какой синтаксис SPARQL позволяет указывать корневой узел, потребляя при этом пути связи из этого узла до заданного предела.

Например,

Пусть Graph1 - анатомическое отображение частей тела.

k_anatomy:K403 a k:Anatomy ;
    rdfs:label "Finger" ;
    k_anatomy:has_parent k_anatomy:K393 .

k_anatomy:K393 a k:Anatomy ;
    rdfs:label "Hand" ;
    k_anatomy:has_parent k_anatomy:K370 .

k_anatomy:K370 a k:Anatomy ;
    rdfs:label "Free Upper Limb" ;
    k_anatomy:has_parent k_anatomy:K359 .


k_anatomy:K359 a k:Anatomy ;
    rdfs:label "Upper Limb" ;
    k_anatomy:has_parent k_anatomy:K358 .


k_anatomy:K358 a k:Anatomy ;
    rdfs:label "Limb" ;
    k_anatomy:has_parent k_anatomy:K2 .


k_anatomy:K2 a k:Anatomy ;
    rdfs:label "Body_by_region" ;
    k_anatomy:has_parent k_anatomy:K1 .


k_anatomy:K1 a k:Anatomy ;
    rdfs:label "Body" ;
    k_anatomy:has_parent k_anatomy:K0 .

Пусть root будет k_anatomy:K403 (rdfs: label "Finger") .

Вопрос

Какой запрос SPARQL задан IRI= k_anatomy:K403 и отношение k_anatomy:has_parent составит следующий результат:

| BodyPart          | PartOf            | 
-----------------------------------------
| Finger            | Hand              |
| Hand              | Free Upper Limb   |
| Free Upper Limb   | Upper Limb        |
| Upper Limb        | Limb              |
| Limb              | Body_by_region    |
| Body_by_region    | Body              |

1 Ответ

0 голосов
/ 12 декабря 2018

Для этого не нужно указывать корневой узел.Этот запрос:

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не образуйте цикл.

...