Отказ от ответственности: Я все еще плохо знаком с Гракном.
Тип отношений, который вы ищете, является переходным (если a-> b и b -> c, то a -> c ). Вы можете использовать правила Гракна для моделирования этого отношения, а затем использовать его в своем запросе; Гракн выводит транзитивное отношение, когда вы выполняете запрос.
Вот как я написал правила, включите это в ваш schema.gql
:
node_superrelation sub relation,
relates base,
relates dependent;
node-relation-is-superrelation-rule sub rule,
when {
(base: $a, dependent: $b) isa node_relation;
},
then {
(base: $a, dependent: $b) isa node_superrelation;
};
node-superrelation-is-transitive-rule sub rule,
when {
(base: $a, dependent: $b) isa node_superrelation;
(base: $b, dependent: $c) isa node_superrelation;
},
then {
(base: $a, dependent: $c) isa node_superrelation;
};
Теперь вы можете использовать следующий запрос, чтобы получить все базы узла F. Обратите внимание, что мы специально запрашиваем те, которые связаны с node_superrelation
.
match $d isa node, has name "F";$b isa node; $rel(base:$b,dependent:$d) isa node_superrelation;get $b;
. Вы можете сделать node_relation
транзитивным и достичь этого в одном правиле, но затем запросить, используя node_relation
из F всегда будет включать все результаты без использования ограничения, что, вероятно, не то, что вы хотите. Вы также можете определить новые роли для node_superrelation
, что также может еще больше упростить вещи, или использовать общие роли для некоторых других преимуществ. Надеюсь, вы можете видеть, что правила Гракна действительно очень мощные и должны позволять вам описывать эти виды отношений таким образом, который имеет смысл для вашей модели!
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ: Просто быстро добавим, что в Гракне принято использовать дефисы, а не подчеркивания.