извлечение цепочки экземпляров, соединяющих два экземпляра через отношение

Я хочу извлечь цепочку экземпляров между двумя экземплярами моей онтологии, задав запрос SPARQL. например, на следующем рисунке, если я хочу знать, как A связан с E, результатом запроса должно быть что-то вроде списка A, B, D, F, E.

введите здесь описание изображения

как должна быть спроектирована онтология и построен запрос? Это вообще возможно?


person msc87    schedule 11.08.2015    source источник


Ответы (1)


Это не слишком сложно. В RDF ваши данные могут быть такими простыми, как прямое кодирование графа:

@prefix : <urn:ex:>

:A :connectedTo :B .
:B :connectedTo :C, :D .
:D :connectedTo :F .
:F :connectedTo :E, :G .

Затем, используя пути свойств SPARQL, вы можете найти каждый узел, для которого существует путь свойств connectedTo от A к нему и от него к E. , включая сами A и E:

prefix : <urn:ex:>

select ?mid where {
  :A :connectedTo* ?mid .
  ?mid :connectedTo* :E .
}
-------
| mid |
=======
| :D  |
| :F  |
| :B  |
| :A  |
| :E  |
-------

Если вы хотите привести их в порядок, вы можете дополнительно подсчитать, сколько элементов находится между A и «средним узлом». (Это описано в моем ответе на Можно ли получить положение элемента в коллекции RDF в SPARQL?)

prefix : <urn:ex:>

select ?mid (count(?premid) as ?i) where {
  :A :connectedTo* ?premid .
  ?premid :connectedTo* ?mid .
  ?mid :connectedTo* :E .
}
group by ?mid

-----------
| mid | i |
===========
| :D  | 3 |
| :F  | 4 |
| :E  | 5 |
| :B  | 2 |
| :A  | 1 |
-----------

If you actually want a single result that looks more or less like "A, B, C, D, E, F", then you adapt these queries using the techniques from my answer to Aggregating results from SPARQL query, which shows how to concatenate these into a single string.

person Joshua Taylor    schedule 11.08.2015
comment
ваш ответ был правильным, но я добавил немного более подробного, что более сложно. - person msc87; 11.08.2015
comment
Я не мог реализовать запрос, как вы предложили. Может быть, потому что мой connetedTo не направлен. если А соединено с В, то В тоже связано с А. - person msc87; 11.08.2015
comment
Если ссылки ненаправленные, вы не сможете сделать это с помощью пути к свойству; так как нет способа указать длину пути свойства, вы не можете отличить путь типа A, B, A, C, D от более короткой версии A, C, D. Как кроме того, не рекомендуется значительно изменять вопрос о переполнении стека; это делает недействительными существующие ответы, приводит к путанице, и если вопрос действительно существенно отличается, его обычно стоит задать как новый вопрос. - person Joshua Taylor; 11.08.2015
comment
вы правы, я не должен.. я удалю новую часть. Я могу задать это как отдельный вопрос, но мне интересно, разрешимо это или нет. - person msc87; 11.08.2015
comment
@ msc87 Как я уже сказал, нет возможности указать длину пути к свойству, вы не можете отличить путь, такой как A, B, A, C, D, и более короткую версию A, C, D. С помощью SPARQL вы не будет способа убедиться, что вы остаетесь на кратчайшем пути, просто есть путь a. - person Joshua Taylor; 11.08.2015