Запрос внутренних элементов на основе роли в гракне - PullRequest
1 голос
/ 12 января 2020

У меня есть имя пространства ключей «сервер» в гракне с одним объектом с именем «узел», имеющим атрибут «имя». Это пространство ключей имеет только одно отношение с именем 'node_relation', которое связывает сущности. Узел сущности играет роль «базовый» и «зависимый» в node_relation.

Graph for keyspace : server

Этот график выровнен таким образом, что все элементы на левой стороне выступая в качестве базового и правостороннего акта, зависимого в node_relation.

Мне нужно запросить узлы, которые действуют как базовый узел для объекта, и если у запрашиваемого узла есть какой-либо узел, который действует как базовый узел, мне нужно чтобы получить его до тех пор, пока у запрашиваемого узла не будет ни одного узла с ролевой базой.

Например, если я хочу, чтобы все узлы с ролевой базой для узла с именем "F", я должен получить ответ с "A , B, C, D, E, DD, EE, FF, XX, YY, ZZ ".

В настоящее время я использую запрос

match $x isa node, has name "F";$y isa node;$rel(base:$x,$y);get $y;** 

Этот запрос возвращает E и DD как результат, и я буду выполнять этот запрос до тех пор, пока у узла не будет узла с ролевой базой.

Есть ли какой-нибудь способ получить все узлы в одном запросе?

1 Ответ

1 голос
/ 12 января 2020

Отказ от ответственности: Я все еще плохо знаком с Гракном.

Тип отношений, который вы ищете, является переходным (если 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, что также может еще больше упростить вещи, или использовать общие роли для некоторых других преимуществ. Надеюсь, вы можете видеть, что правила Гракна действительно очень мощные и должны позволять вам описывать эти виды отношений таким образом, который имеет смысл для вашей модели!

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Просто быстро добавим, что в Гракне принято использовать дефисы, а не подчеркивания.

...