Вы можете сделать хотя бы кое-что из этого с помощью SPARQL 1.1.
Получение списка узлов
Предположим, у вас есть данные, в которых есть две группы точек, которые образуют строки на основена :eastOf
:
@prefix : <http://stackoverflow.com/q/4056008/1281433/>
:a :eastOf :b .
:b :eastOf :c .
:c :eastOf :d .
:e :eastOf :f .
:f :eastOf :g .
:g :eastOf :h .
Затем вы можете использовать запрос, подобный следующему:
prefix : <http://stackoverflow.com/q/4056008/1281433/>
select (group_concat(strafter(str(?westernpoint),str(:));separator=", ") as ?colatitudinalPoints)
where {
?easternmost :eastOf* ?westernpoint .
filter not exists { ?easternmoster :eastOf ?easternmost }
}
group by ?easternmost
, чтобы получить эти результаты:
-----------------------
| colatitudinalPoints |
=======================
| "e, f, g, h" |
| "a, b, c, d" |
-----------------------
Есть некоторая обработка строки в
group_concat(strafter(str(?westernpoint),str(:));separator=", ") as ?colatitudinalPoints
, который вам может не понадобиться;Дело в том, что ?westernpoint
- это IRI точек к западу от восточной части ?easternmost
(который на самом деле включает ?easternmost
, поскольку мы использовали *
в пути свойств), и затем нам нужно объединить их вместекак-то.Здесь я сделал некоторую обработку строк, чтобы сделать результаты более красивыми.Вы можете так же легко сделать
prefix : <http://stackoverflow.com/q/4056008/1281433/>
select (group_concat(?westernpoint;separator=", ") as ?colatitudinalPoints)
where {
?easternmost :eastOf* ?westernpoint .
filter not exists { ?easternmoster :eastOf ?easternmost }
}
group by ?easternmost
и получить
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| colatitudinalPoints |
============================================================================================================================================================================================
| "http://stackoverflow.com/q/4056008/1281433/e, http://stackoverflow.com/q/4056008/1281433/f, http://stackoverflow.com/q/4056008/1281433/g, http://stackoverflow.com/q/4056008/1281433/h" |
| "http://stackoverflow.com/q/4056008/1281433/a, http://stackoverflow.com/q/4056008/1281433/b, http://stackoverflow.com/q/4056008/1281433/c, http://stackoverflow.com/q/4056008/1281433/d" |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Обеспечение того, что узлы возрастают
Ваше другое требование немного сложнее:
Меня интересуют только списки, в которых свойство xsd: integer всех узлов возрастает при переходе с запада на восток, но это должно быть относительно легко после того, как у меня будет решение для моей первой проблемы.
Тем не менее, если вы можете уточнить, что именно вы хотите в случае чего-то вроде
w --eastof-> x --eastof-> y --eastof-> z
| | | |
5 6 2 3
Например, хотите ли вы отклонить всю цепочку, потому что узлы не 't все по возрастанию, или вы хотите получить две подцепи w x
и y z
, в которых значения возрастают?Может быть возможно сделать и то, и другое ...