Чтобы построить иерархию ролей в 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;