Cypher Query для сбора произвольных узлов глубины и свойств ребер - PullRequest
4 голосов
/ 22 января 2020

У меня есть график, который выглядит как на рисунке ниже. Тем не менее, глубина и количество свертываний от человека до самого верхнего свертки варьируется в зависимости от того, как они были структурированы пользователем. Ребра от Person до Metri c (HAS_METRI C) имеют значения баллов, а отношения от метрик к свертку (HAS_PARENT) имеют весовые коэффициенты, которые должны применяться к значению при его сворачивании в высший балл.

graph

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

    node    |  value
 -------------------
   Metric A    23
   Metric B    55
   Metric C    29
   Metric D    78
   Rollup A    45.4
   Rollup B    58.4
   Rollup Tot  51.9

Однако я не понимаю, как собирать свойства ребер для HAS_PARENTS.

MATCH (p:Person)-[score:HAS_METRIC]->(m:Metric)-[weight:HAS_PARENT]->(ru:Rollup)
        -[par_rel:HAS_PARENT*..8]->(ru_par:Rollup)
WITH p, score, m, weight, par_rel, ru, ru_par
RETURN p.uid, score.score, m.uid, weight.weight, ru.uid par_rel.weight, ru_par.uid

Этот запрос дает мне несоответствие типов, потому что он не знает, что делать с par_rel.weight. Любые указатели приветствуются.

1 Ответ

0 голосов
/ 26 января 2020

Я считаю, что вы ищете функцию relationships(path). Это одна из функций пути по умолчанию в Cypher. Он возвращает все отношения - это определенный путь , и вы можете объединить его с одним или несколькими Cypher выражениями списка , чтобы получить значения, которые вам нужны из отношений.

Вообще говоря, вы можете сделать что-то вроде:

MATCH p = (n)-[:HAS_PARENT*..8]->()
RETURN [x IN relationships(p) | x.weight] AS weights

Также вам может пригодиться функция reduce. Например:

...
RETURN reduce(s = 0, x IN relationships(p) | s + x.weight) AS sumWeight

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

Хорошим советом будет, вероятно, отметить ваш лист и root узлы, чтобы сопоставить только пути от листа до root, а не только промежуточные. Например:

MATCH p = (n)-[:HAS_PARENT*..8]->(root)
WHERE NOT (root)-[:HAS_PARENT]->() AND NOT (n)<-[:HAS_PARENT]-()
...

И, конечно, вы можете объединить эти шифры с другими, чтобы вернуть все, что вам нужно, в одном запросе.

Надеюсь, это поможет. Дайте нам знать, когда вам это удастся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...