Как рассчитать средний кратчайший путь сети в Neo4J с использованием шифра - PullRequest
0 голосов
/ 25 марта 2020

У меня есть 9 узлов в направленной сети (все имеют как минимум 1 соединение), так что всего 72 кратчайших пути. Я хочу найти среднее из 72 кратчайших путей.

Вот код, который я использовал, чтобы найти все кратчайшие пути между множеством узлов (изменено с https://community.neo4j.com/t/all-shortest-paths-between-a-set-of-nodes/241)

MATCH (p:Person)
WITH collect(p) as nodes
UNWIND nodes as n
UNWIND nodes as m
WITH * WHERE id(n)<id(m)
MATCH path = allShortestPaths((n)-[:KNOWS*]-(m))
RETURN length(path)

Результат на первый взгляд выглядит правильным. Он имеет пути 1, 2, 3, 4, 5 и 6. Однако я заметил, что есть 408 результатов, когда должно быть только 72.

Буду признателен за любую информацию о том, где я ошибся.

1 Ответ

2 голосов
/ 25 марта 2020
  1. Функция allShortestPaths возвращает все кратчайшие пути, поэтому она может возвращать несколько путей, если все они имеют одинаковую (самую короткую) длину. Чтобы получить только 1 кратчайший путь, вы должны использовать вместо этого функцию shortestPath.
  2. Количество уникальных пар узлов из 9 узлов не равно 9 * 8 (или 72). Это половина или 36.

Этот запрос должен вернуть 36 результатов:

MATCH (p:Person)
WITH collect(p) as nodes
UNWIND nodes as n
UNWIND nodes as m
WITH n, m WHERE id(n)<id(m)
MATCH path = shortestPath((n)-[:KNOWS*]-(m))
RETURN length(path)

Чтобы получить среднюю длину, просто используйте вместо этого предложение RETURN:

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