Есть ли способ получить только узлы в самом глубоком слое? - PullRequest
1 голос
/ 07 января 2020

У меня есть граф с узлами 'person', базовым c отношением 'parent-child' между некоторыми узлами и транзитивным отношением 'Потомок'.

для указанного c ' человек "Я хотел бы получить самых старых" бабушек и дедушек ", о которых знает график ТОЛЬКО. что означает - они не играют «потомок» для любого другого узла.

что было бы хорошим способом для достижения этого?

спасибо

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вы можете сначала использовать правило Гракна для создания транзитивных ссылок:

transitive-parentship sub rule, when {
  (ancestor: $p, descendant: $c) isa ancestorship;
  (ancestor: $c, descendant: $x) isa ancestorship;
}, then {
  (ancestor: $p, descendant: $x) isa ancestorship;
}

, затем во время чтения вы можете использовать отрицание, чтобы найти самого старого предка человека:

match 
  $p isa person, has name "John Smit";
  (ancestor: $ancient, descendant: $p) isa ancestorship;
  not { (ancestor: $evenolder, descendant: $ancient) isa ancestorship; };
get $p, $ancient;

Это найдет самого старого предка, у которого нет другого предка. Обратите внимание, что для этого требуется график acylcli c!

1 голос
/ 21 февраля 2020

Предполагая:

  • У каждого узла есть 2 родителя
  • График ацикличен c

Сначала прочитайте все ребра и добавьте двух родителей в parent словарь. Так что у parent[some_id] будет два родителя. Затем вызовите рекурсивную функцию следующим образом:

def get_grandpa_age(x):
  if not parent[x.id]:
    return x.age
  mother_side = get_grandpa_age(parent[x.id][0])
  fathers_side = get_grandpa_age(parent[x.id][1])
  return max(mothers_side, fathers_side)

get_grandpa_age(some_entity)
...