SPARQL Запрос Транзитивный - PullRequest
       37

SPARQL Запрос Транзитивный

9 голосов
/ 20 декабря 2011

Я новичок в SPARQL, и мне было интересно, есть ли запрос, который может помочь мне вернуть транзитивные отношения. Например, файл n3 ниже, я бы хотел запрос, который бы возвратил "a is sames c" или что-то в этом роде. Спасибо

@prefix : <http://websitename.com/links/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .

:a owl:sameas :b.
:b owl:sameas :c.

Ответы [ 2 ]

13 голосов
/ 20 декабря 2011

Вы можете использовать пути к свойствам, если вы используете соответственно включенный механизм SPARQL 1.1, вы отметили свой вопрос как Jena, поэтому я предполагаю, что вы используете его механизм ARQ, который поддерживает эту функцию.

Таким образом, вы можете написать запрос, подобный следующему:

PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT *
WHERE
{
  ?x owl:sameAs+ ?y
}

Обратите внимание на + после предиката, который используется для указания того, что он должен искать отношения, состоящие из одного или нескольких шагов.

Синтаксис для путей к свойствам можно найти здесь и очень похож на регулярное выражение. Единственный недостаток запросов, использующих это, заключается в том, что вы не получаете никакой информации о том, как длинные пути или каковы промежуточные узлы.

4 голосов
/ 29 мая 2012

Хотя Ответ RobV является правильным в вашем случае, я думаю, что двунаправленная природа совы: sameAs стоит упомянуть.

Давайте расширим ваш пример следующим образом:

:a owl:sameAs :d.
:e owl:sameAs :d.

В этом случае простого owl:sameAs+ будет недостаточно, чтобы найти :e, поэтому, возможно, используйте что-то вроде (owl:sameAs|^owl:sameAs)+, чтобы найти все дерево эквивалентности.Имейте в виду, что в зависимости от конечной точки это может вызывать циклы.

Также могут существовать специфичные для реализации расширения для обработки owl:sameAs рассуждений, например, в Virtuoso :

DEFINE input:same-as "yes"
select * where { :a ?p ?o. }

возвращаются также ?p и ?o, выданные на :b, :c, :d и :e.

...