Группировка по пустым узлам

У меня есть следующие данные:

@prefix f: <http://example.org#> .

_:a f:trait "Rude"@en .
_:a f:name "John" .
_:a f:surname "Roy" .
_:b f:trait "Crude"@en .
_:b f:name "Mary" .
_:b f:surname "Lestern" .

Однако, если я выполню следующий запрос в Blazegraph:

PREFIX f: <http://example.org#>

SELECT ?s ?o
WHERE
{
    ?s f:trait ?o .
}

Я получаю шесть результатов:

s   o
t32 Crude
t37 Crude
t39 Crude
t31 Rude
t36 Rude
t38 Rude

Если пустые узлы _:a а также _:b разные узлы, как мне написать запрос SPARQL, чтобы получить только два разных результата? я пытался SELECT DISTINCT, но он по-прежнему возвращает шесть результатов. Я пробовал группировать по ?o, но Blazegraph возвращает ошибку, говоря, что это плохая совокупность. Почему происходит такой вывод повторяющихся кортежей? И как этого избежать?

1 ответ

Решение

Проблема в том, что вы вставили данные, содержащие пустые узлы, несколько раз. Эта операция не идемпотентна.

Полезные цитаты

Из концепции RDF 1.1 и абстрактного синтаксиса:

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

Из RDF 1.1 Семантика:

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

Из языка запросов SPARQL 1.1:

Пустые метки узлов ограничиваются набором результатов.

Там не должно быть никакого отношения между этикеткой _:a в результирующем наборе и пустой узел в графе данных с одинаковой меткой.

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

Из обновления SPARQL 1.1:

Пустые узлы... предполагаются не пересекающимися с пустыми узлами в хранилище графиков, т. Е. Будут вставляться со "свежими" пустыми узлами.

Некоторое обсуждение

Различные триплеты предоставляют решения для описанных "проблем". Например, Jena позволяет использовать псевдо-URI, такие как <_:b1> и т.п.

Другие вопросы по тегам