Транзитивный запрос SPARQL с уникальными предикатами

У меня есть несколько троек, организованных следующим образом.

:A :hasB :B
:B :hasC :C
:C :hasD :D
:D :hasE :E
............
:X :hasY :Y 
:Y :hasZ :Z

Все предикаты уникальны.

Мне нужно написать два запроса SPARQL.

Запрос 1 найдет все предикаты от :A до :Z с помощью транзитивного запроса (что-то вроде этого :A :has* :Z). Результат 1 должен выглядеть следующим образом.

Output 1:
--------
hasB
hasC
hasD
....
hasZ

Ouery 2 найдет тройки от :A до :Z с помощью транзитивного запроса. Результат 2 должен выглядеть следующим образом.

Output 2:
--------
:B :hasC :C
:C :hasD :D
:D :hasE :E
............
:X :hasY :Y

Пожалуйста, дайте мне знать, как писать эти транзитивные запросы SPARQL.


person Beautiful Mind    schedule 22.11.2017    source источник
comment
Это невозможно с вашими текущими данными. В выражении пути к свойству не может быть шаблона регулярного выражения. Одним из обходных путей было бы ввести суперсвойство :has и использовать его в запросе. Если у ваших данных нет других свойств, вы также можете попробовать использовать шаблон подстановки <p>|!<p> и запросить пути.   -  person UninformedUser    schedule 22.11.2017
comment
Я знаю, что вы снова проигнорируете этот комментарий, но: Вы никогда не принимали никаких ответов на свои вопросы. StackOverflow работает не так, извините.   -  person UninformedUser    schedule 22.11.2017
comment
Спасибо за вашу помощь. Просто прими один ответ. Я скоро сделаю еще.   -  person Beautiful Mind    schedule 22.11.2017
comment
По поводу вашего вопроса. Можно ли добавить суперсвойство :has?   -  person UninformedUser    schedule 22.11.2017


Ответы (1)


SPARQL имеет некоторые очевидные ограничения, поскольку это не язык запросов графов. Возможные решения ниже:

Если кроме has[A-Z] нет других предикатов:

Пример данных

@prefix : <http://ex.org/> .
:A :hasB :B .
:B :hasC :C .
:C :hasD :D .
:D :hasE :E .

Запрос

prefix : <http://ex.org/>
select ?p
where {
values (?start ?end) { (:A :E) }
  ?start (<p>|!<p>)* ?v1 .
  ?v1 ?p ?v2 .
  ?v2 (<p>|!<p>)* ?end .
}

Вывод

---------
| p     |
=========
| :hasB |
| :hasC |
| :hasD |
| :hasE |
---------

Если кроме has[A-Z] есть другие предикаты:

Пример данных

@prefix : <http://ex.org/> .
:A :hasB :B .
:B :hasC :C .
:C :hasD :D .
:C :notHasD :D .
:D :hasE :E .
  1. Представьте супер свойство :has:

    Дополнительная информация:

    @prefix : <http://ex.org/> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    :hasB rdfs:subPropertyOf :has .
    :hasC rdfs:subPropertyOf :has .
    :hasD rdfs:subPropertyOf :has .
    :hasE rdfs:subPropertyOf :has .
    

    Запрос:

    prefix : <http://ex.org/>
    prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    select ?p
    where {
    values (?start ?end) { (:A :E) }
      ?start (<p>|!<p>)* ?v1 .
      ?v1 ?p ?v2 . ?p rdfs:subPropertyOf :has .
      ?v2 (<p>|!<p>)* ?end .
    }
    

    Вывод

    ---------
    | p     |
    =========
    | :hasB |
    | :hasC |
    | :hasD |
    | :hasE |
    ---------
    
  2. Используйте REGEX для URI свойства:

    prefix : <http://ex.org/>
    select ?p
    where {
      values (?start ?end) { (:A :E) }
      ?start (<p>|!<p>)* ?v1 .
      ?v1 ?p ?v2 . 
      FILTER(REGEX(STRAFTER(STR(?p), STR(:)), 'has[A-Z]'))
      ?v2 (<p>|!<p>)* ?end .
    }
    

Обратите внимание, что все предлагаемые решения не будут работать со всеми типами данных, особенно если у вас есть несколько путей и / или циклов. В этом случае вам следует использовать подходящую базу данных графов.

person UninformedUser    schedule 22.11.2017