Подсчет Neo4j не предсказуем - PullRequest
0 голосов
/ 01 мая 2020

Используя пример предпочтительного вложения в руководствах, у меня есть узел C со степенью 3 и узел E со степенью 1

UNWIND [["A", "C"], ["A", "B"], ["B", "D"],
    ["B", "C"], ["B", "E"], ["C", "D"]] AS pair
MERGE (n1:Node {name: pair[0]})
MERGE (n2:Node {name: pair[1]})
MERGE (n1)-[:FRIENDS]-(n2)

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

MATCH (e:Node {name: 'E'})--(othere)
RETURN e,othere, count(othere) 

, возвращается 1 для счетчика (другое)

MATCH (c:Node {name: 'C'})--(otherc)
MATCH (e:Node {name: 'E'})--(othere)
RETURN e,othere, count(othere)

возвращает 3 для счетчика (другое). Почему это должно быть?

1 Ответ

1 голос
/ 02 мая 2020

В предложении RETURN вашего последнего запроса агрегирующая функция COUNT подсчитывает количество строк результатов , которые имеют одинаковые значения e и othere. С вашими примерами данных есть 3 таких строки результатов.

Вот один из способов получить правильный счетчик количества отношений между e и othere:

MATCH (c:Node {name: 'C'})--(otherc)
MATCH (e:Node {name: 'E'})-[r]-(othere)
RETURN e, othere, COUNT(DISTINCT r)

[ОБСУЖДЕНИЕ]

В общем, между любыми двумя узлами может быть любое количество связей. Итак, чтобы сделать это более общим обсуждением, предположим, что узел «E» имеет 2 связи с узлом «B» (и никаких других связей).

  • Мой запрос вернул бы правильный COUNT (градус) из 2. Помните, что градус узла - это его число отношений .

  • Подобный вид запрос, который возвратил COUNT(DISTINCT othere) вместо COUNT(DISTINCT r), вернул бы 1, что неверно.

  • Предложение второго предложения возврата (RETURN e, othere, COUNT(othere)) вернуло бы COUNT из 6 (потому что было бы 6 строк результата с othere).

Надеюсь, это поможет понять, почему я использовал COUNT(DISTINCT r). Вам также следует внимательно прочитать документацию по функции агрегирования .

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