Мне нужен уникальный идентификатор (uuid) для всего запроса независимо от количества совпадений.
Рассмотрим следующие данные
@prefix ex:<http://www.example.org/>
ex:John ex:knows ex:Kathrin.
ex:John ex:knows ex:Peter.
ex:John ex:worksAt ex:coolShop.
Данные говорят нам, что Джон знает некоторых людейи работает в coolShop.
Теперь у нас есть запрос INSERT:
1 PREFIX ex:<http://www.example.org/>
2 INSERT{
3 ?john ex:knows ex:Alan.
4 ?john ex:hasRandomUUID ?uuid.
5 }
6 WHERE{
7 ?john ex:knows ?friend.
8 OPTIONAL{
9 ?john ex:worksAt ?shop
10 BIND(STRUUID() AS ?uuid)
11 }
12 }
Этот запрос добавляет, что Джон знает Алана.Кроме того, я хочу вставить уникальный идентификатор для Джона, обозначенный ?john ex:hasRandomUUID ?uuid
.Но я хочу добавить этот уникальный идентификатор, только если Джон где-нибудь работает.Поэтому мы связываем BIND(STRUUID() AS ?uuid)
в дополнительном предложении.Поэтому, если ?john ex:worksAt ?shop
соответствует, мы привязываем уникальный идентификатор к ?uuid
.(Предположим, что человек может работать только на месте сразу, и предположим, что в дополнительном предложении может быть более одной тройки.)
Пока все хорошо.
Моя проблема сейчасчто из-за того, что ?john ex:knows ?friend
в строке 7 совпадает дважды, BIND(STRUUID() AS ?uuid)
оценивается дважды и, таким образом, генерируется 2 разных uuids.Из-за того, что генерируется 2 разных uuids, вставляются две тройки вида ex:John ex:hasRandomUUID uuid
, хотя я хочу только одну.Как я могу убедиться, что только один uuid создан независимо от каких-либо совпадений или что вставлена только одна тройка формы ex:John ex:hasRandomUUID uuid
.
Обратите внимание, что я не могу использовать что-то вроде Bind(ex:John AS ?john)
вместо строки 6.
Я работаю с Apache Jena Fuseki.
Большое спасибо.
EDIT: Это сработало для меня:
1 PREFIX ex:<http://www.example.org/>
2 INSERT{
3 ?john ex:knows ex:Alan.
4 ?john ex:hasRandomUUID ?uuid.
5 }
6 WHERE{
7 ?john ex:knows ?friend.
8 {
9 OPTIONAL{
10 ?john ex:worksAt ?shop
11 BIND(STRUUID() AS ?uuid)
12 }
13 }
14 }
Добавив строку8 и строке 13 все предложение OPTIONAL
помещается в подзапрос.Это приводит к тому, что STRUUID()
оценивается только один раз, и только в тройку формы ex:John ex:hasRandomUUID uuid
вставляется в набор данных.