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

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

@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 возвращает ошибку, говоря, что это неверный агрегат. Почему происходит такой вывод повторяющихся кортежей? И как этого избежать?


person Gitnik    schedule 10.06.2017    source источник
comment
Что вы точно имеете в виду, говоря, что у меня есть следующие данные? Я предполагаю, что ваша проблема похожа на эту.   -  person Stanislav Kralin    schedule 11.06.2017
comment
@StanislavKralin Я имею в виду, что это данные, которые я загрузил в blazegraph, используя вкладку обновления в приложении. Это всего лишь небольшой набор данных для практики, потому что я изучаю SPARQL. Так что это может быть ошибка, если я правильно понял вашу ссылку.   -  person Gitnik    schedule 11.06.2017
comment
Если вы действительно получаете 6 результатов по этому запросу для ваших выборочных данных на одном графике, значит, что-то не так в Blazegraph.   -  person UninformedUser    schedule 11.06.2017
comment
Лилиан, сколько раз ты нажимала кнопку «Обновить»? Думаю, ровно 3 раза. Пустые метки узлов не являются URI, они сохраняются только в текущей транзакции. _:a в вашем первом обновлении не совпадает с _:a во втором обновлении.   -  person Stanislav Kralin    schedule 11.06.2017
comment
@StanislavKralin Кажется, ты прав. После перезагрузки моего ПК и повторной загрузки данных (нажав кнопку «Обновить» только один раз) запрос возвращает ровно два результата. После повторного нажатия кнопки «Обновить» запрос возвращает четыре результата и т. д. Можете ли вы объяснить, что вы имели в виду под a current transaction? Почему второе обновление не отменяет первое? Кажется, что данные сохраняются в памяти. Может ли это быть связано с Java GC? Кроме того, если вы можете написать свой ответ в разделе ответов, чтобы я мог принять его как решение :)   -  person Gitnik    schedule 11.06.2017
comment
Каждое обновление генерирует новые пустые узлы — это анонимные узлы, как транзакция может узнать об этом из предыдущего действия?   -  person UninformedUser    schedule 11.06.2017
comment
Я просто хочу добавить, что проблема решается, когда я меняю пространство имен и загружаю данные в новое пространство имен. Но если я использую старое пространство имен, где я нажимал «Обновить» 3 раза, указанный запрос возвращает шесть строк.   -  person Gitnik    schedule 11.06.2017


Ответы (1)


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

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

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

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

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

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

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

Метки пустых узлов ограничены результирующим набором.

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

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

Из SPARQL 1.1 Update:

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

Обсуждение

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

person Stanislav Kralin    schedule 12.06.2017