Как смоделировать иерархии ролей (и отношения между ними) с помощью Grakn / Graql? - PullRequest
4 голосов
/ 28 апреля 2020

Я начинаю использовать Grakn, и мне тяжело с тем, как роли и отношения "связаны". В частности, у меня есть некоторые трудности при моделировании иерархий ролей.

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

Итак, у меня было бы что-то вроде:

тип: персона

  • роль: клиент уровень 1
  • роль: уровень клиента 2 (уровень дополнительного клиента 1)
  • роль: уровень клиента 3 (уровень дополнительного клиента 2)

    ...

тип: объект

  • роль: уровень продукта 1
  • роль: уровень продукта 2 (уровень дополнительного продукта 1)
  • роль: уровень продукта 3 (уровень дополнительного продукта 2) ...

Эта связь уникальна (покупает) и используется для связи ролей с учетом соответствующих уровней в иерархии:

     customer level 1 --- buys --- product level 1
     customer level 2 --- buys --- product level 2
     customer level 3 --- buys --- product level 3

Во втором сценарии у меня была бы только одна иерархия ролей, у заказчика и у типа объекта была бы только одна роль: продукт. Таким образом, отношения будут выглядеть примерно так:

     customer level 1 --- buys --- product
     customer level 2 --- buys --- product
     customer level 3 --- buys --- product

Как я могу смоделировать такую ​​проблему с Grakn (Graql)? Я был бы признателен, если бы кто-то мог показать, как эта (или похожая) проблема будет смоделирована с помощью Graql.

1 Ответ

2 голосов
/ 28 апреля 2020

Чтобы построить иерархию ролей в Graql, вам нужно переопределить родительскую роль с дочерним, определив дочернее отношение.

Я думаю, что для вашего первого случая есть два возможных варианта, в зависимости от того, что вы хотите для ограничения:

define

buys sub relation,
  abstract,
  relates product,
  relates customer;

buys-level-1 sub buys,
  relates product-level-1 as product,
  relates customer-level-1 as customer;

buys-level-2 sub buys-level-1,
  relates product-level-2 as product-level-1,
  relates customer-level-2 as customer-level-1;

buys-level-3 sub buys-level-2,
  relates product-level-3 as product-level-2,
  relates customer-level-3 as customer-level-2;

person sub entity,
  plays customer-level-1,
  plays customer-level-2,
  plays customer-level-3;

object sub entity,
  plays product-level-1,
  plays product-level-2,
  plays product-level-3;

В этом сценарии, если вы вставили отношение buys-level-3:

insert 
$per isa person; $obj isa object;
$b(product-level-3: $obj, customer-level-3: $per) isa buys-level-3;

Вы сможете сопоставить его с помощью buys-level-2, buys-level-1 и buys. Таким образом, этот запрос вернет человека и отношение, которое мы только что вставили:

match $b(customer-level-1: $per) isa buys-level-1; get;

В качестве альтернативы, вы можете изменить ограничение следующим образом:

buys-level-3 sub buys,
  relates product-level-3 as product,
  relates customer-level-3 as customer;

В этом случае match мы сделали бы не вернуть вставленное отношение или лицо. Пусть ограничения, которые вы хотите наложить на ваши запросы / данные, помогут вам выбрать лучшую модель.

Второй сценарий тогда легко увидеть, у нас есть:

define

buys sub relation,
  abstract,
  relates product,
  relates customer;

buys-level-1 sub buys,
  relates product,
  relates customer-level-1 as customer;

buys-level-2 sub buys-level-1,
  relates product,
  relates customer-level-2 as customer-level-1;

buys-level-3 sub buys-level-2,
  relates product,
  relates customer-level-3 as customer-level-2;

person sub entity,
  plays customer-level-1,
  plays customer-level-2,
  plays customer-level-3;

object sub entity,
  plays product;

In В любом из этих сценариев ios вы можете получить все buys отношений и их ролевых игр с помощью:

match $b(customer: $per, product: $obj) isa buys; get;
...