Создайте уникальный идентификатор для всего запроса SPARQL - PullRequest
0 голосов
/ 13 декабря 2018

Мне нужен уникальный идентификатор (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 вставляется в набор данных.

1 Ответ

0 голосов
/ 14 декабря 2018

Один из подходов состоит в том, чтобы назначить потенциальный идентификатор, когда запрос соответствует ?john, а затем присвоить его фактической переменной, когда это необходимо:

WHERE
  {
    ?john ex:knows ?friend .
    BIND ( STRUUID() AS ?uuidX )
    {
      OPTIONAL
        {
          ?john ex:worksAt ?shop .
          BIND ( ?uuidX AS ?uuid )
        }
    }
  }
...