Neo 4j - Как посчитать, сколько раз два отношения появляются в одних и тех же узлах - PullRequest
0 голосов
/ 22 октября 2018

Предположим, у меня есть 3 узла A, B и C и две взаимосвязи r1 и r2. Как я могу посчитать, сколько раз эти две взаимосвязи встречаются на одних и тех же узлах?Например:

A-[r1]-B
A-[r2]-B

A-[r1]-C
B-[r1]-C
B-[r2]-C

Как видите, r1 появляется 3 раза, а r2 два раза, но на тех же узлах у нас есть A- [r1: r2] -B и B [r1: r2] -C, поэтому значение счетчика, которое я ищу, равно 2, потому что и A, и B, B и C. имеют два отношения между ними.

Для возможного дубликата мне не интересно считать числораз отношения происходят между двумя узлами, я хочу сосчитать все случаи, когда это происходит.Извините за мой английский и спасибо.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я предполагаю, что вы имеете в виду «количество раз, когда 2 узла имеют ровно 2 отношения между ними», но идея здесь в том, чтобы сохранить Cypher простым, чтобы шаблон, который вы используете, был довольно прост в использовании.Вы можете использовать SIZE для подсчета вхождений определенного шаблона между узлами и EXISTS, чтобы проверить, существует ли он просто.Здесь мы используем где найти пары узлов, которые соответствуют шаблону, который нас интересует, а затем мы возвращаем количество строк как количество вхождений этого шаблона.

MATCH (a), (b)
WHERE ID(a) > ID(b) // create distinction between a and b
AND SIZE((a)--(b)) = 2 // match the pattern we are looking for between them
RETURN COUNT(*) as occurrences // return count

Шаблонтакже может быть EXISTS((a)-[:r1]-(b)-[:r2]-(a)) (обратите внимание, что WHERE EXISTS((a)--(b)) эквивалентно WHERE (a)--(b), но первая форма немного более понятна)

0 голосов
/ 22 октября 2018

1.Ваш график

Для простоты возможных дальнейших ответов и решений я отмечу мое утверждение создания графика:

CREATE
  (a:NodeA {name: 'A'})-[:RelationType1]->(b:NodeB {name: 'B'}),
  (a)-[:RelationType2]->(b),
  (a)-[:RelationType1]->(c:NodeC {name: 'C'}),
  (b)-[:RelationType1]->(c),
  (b)-[:RelationType2]->(c);

YourGraph

2.Визуализация вхождений

2.1 Решение

MATCH
  (startNode)-[:RelationType1]-(endNode)-[:RelationType2]-(startNode)
  WHERE
  id(startNode) < id(endNode)
RETURN
  startNode.name AS startNodeName, endNode.name AS endNodeName;

Сравнение id в предложении WHERE строки 4 позволяет избежать наличия двух отношений на пару (по одному в каждом направлении) и предотвращает создание отношенияот узлов к себе.

2.2 Результаты

╒═══════════════╤═════════════╕
│"startNodeName"│"endNodeName"│
╞═══════════════╪═════════════╡
│"A"            │"B"          │
├───────────────┼─────────────┤
│"B"            │"C"          │
└───────────────┴─────────────┘

3.Количество вхождений

3.1 Решение

MATCH
  (startNode)-[:RelationType1]-(endNode)-[:RelationType2]-(startNode)
  WHERE
  id(startNode) < id(endNode)
RETURN
  count(startNode) AS amount;

3.2 Результат

╒════════╕
│"amount"│
╞════════╡
│2       │
└────────┘
...