Фильтр пути свойства в SPARQL 1.1

Есть ли способ отфильтровать запрос, например

select ?x ?y  where {?x <http://relationship.com/wasRevisionOf>+ ?y }";

который имеет следующий вывод для предоставленного набора данных:

http://article.com/2-3 http://article.com/2-2
http://article.com/2-3 http://article.com/2-1
http://article.com/2-4 http://article.com/2-3
http://article.com/2-4 http://article.com/2-2
http://article.com/2-4 http://article.com/2-1
http://article.com/2-2 http://article.com/2-1
http://article.com/1-3 http://article.com/1-2
http://article.com/1-3 http://article.com/1-1
http://article.com/1-2 http://article.com/1-1

Как мы можем отфильтровать запрос, чтобы удалить все результаты со значением ?x, равным значению ?y в другом результате. При этом мы получим

http://article.com/2-4 http://article.com/2-3
http://article.com/2-4 http://article.com/2-2
http://article.com/2-4 http://article.com/2-1

поскольку значение ?x всех других результатов встречается как значение ?y в других результатах.

Вот набор данных:

<http://article.com/1-3> <http://relationship.com/wasGeneratedBy> <http://edit.com/comment1-2> .
<http://article.com/1-3> <http://relationship.com/wasRevisionOf> <http://article.com/1-2> .
<http://edit.com/comment1-2> <http://relationship.com/used> <http://article.com/1-2> .
<http://edit.com/comment1-2> <http://relationship.com/wasAssociatedWith> <http://editor.com/user1-1> .

<http://article.com/1-2> <http://relationship.com/wasGeneratedBy> <http://edit.com/comment1-1> .
<http://article.com/1-2> <http://relationship.com/wasRevisionOf> <http://article.com/1-1> .
<http://edit.com/comment1-1> <http://relationship.com/used> <http://article.com/1-1> .
<http://edit.com/comment1-1> <http://relationship.com/wasAssociatedWith> <http://editor.com/user1-1> .

<http://article.com/2-4> <http://relationship.com/wasGeneratedBy> <http://edit.com/comment2-3> .
<http://article.com/2-4> <http://relationship.com/wasRevisionOf> <http://article.com/2-3> .
<http://edit.com/comment2-3> <http://relationship.com/used> <http://article.com/2-3> .
<http://edit.com/comment2-3> <http://relationship.com/wasAssociatedWith> <http://editor.com/user2-3> .

<http://article.com/2-3> <http://relationship.com/wasGeneratedBy> <http://edit.com/comment2-2> .
<http://article.com/2-3> <http://relationship.com/wasRevisionOf> <http://article.com/2-2> .
<http://edit.com/comment2-2> <http://relationship.com/used> <http://article.com/2-2> .
<http://edit.com/comment2-2> <http://relationship.com/wasAssociatedWith> <http://editor.com/user2-2> .

<http://article.com/2-2> <http://relationship.com/wasGeneratedBy> <http://edit.com/comment2-1> .
<http://article.com/2-2> <http://relationship.com/wasRevisionOf> <http://article.com/2-1> .
<http://edit.com/comment2-1> <http://relationship.com/used> <http://article.com/2-1> .
<http://edit.com/comment2-1> <http://relationship.com/wasAssociatedWith> <http://editor.com/user2-1> .

person Java Developer    schedule 10.05.2016    source источник


Ответы (1)


select ?x ?y  where {?x <http://relationship.com/wasRevisionOf>+ ?y }

Как мы можем отфильтровать запрос, чтобы удалить все результаты со значением ?x, равным значению ?y в другом результате.

Если значение ?x в одной строке совпадает со значением ?y в другой, это означает, что ?x был объектом некоторой тройки в свойстве wasRevisionOf. Вы можете просто отфильтровать их:

select ?x ?y  where {
  ?x <http://relationship.com/wasRevisionOf>+ ?y
  filter not exists {
    ?something <http://relationship.com/wasRevisionOf> ?x
  }
}

Это гарантирует, что каждое значение ?x является «началом» цепочки.

person Joshua Taylor    schedule 10.05.2016