Неожиданный результат запроса шифрования neo4j

StackOverflow https://stackoverflow.com//questions/12668041

  •  11-12-2019
  •  | 
  •  

Вопрос

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

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

neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b) return sum(r.duration)
==> +-----------------+
==> | sum(r.duration) |
==> +-----------------+
==> | 12418           |
==> +-----------------+
==> 1 row, 0 ms

Далее нам нужно проверить, кто из его соседей знает конкретного человека (скажем, c), и просуммировать только продолжительность разговоров между a и b, где b знает c:

neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b)-[p:KNOWS]->(c) return sum(r.duration)
==> +-----------------+
==> | sum(r.duration) |
==> +-----------------+
==> | 21013           |
==> +-----------------+
==> 1 row, 0 ms

Что здесь не кажется логичным, так это то, что вторая сумма больше первой, тогда как вторая должна быть лишь частью первой.Кто-нибудь знает, в чем может быть проблема для получения такого результата?Ошибка появилась у 7 пользователей из 15000.

Это было полезно?

Решение

В этом запросе вы не смотрите на конкретного человека C.Вы сопоставляете все пути с любым отношением :KNOWS, поэтому, если у вас есть a->b->c и a->b->d, ваша продолжительность между a->b будет учитываться дважды.

Вместо этого вам, вероятно, нужно сделать следующее:

start a = node(351061), c=node(xxxxx) // set c explicitly
match (a)-[r:TALKED_TO]->(b)
where b-[:KNOWS]->c // putting this in the where clause forces you to set C
return sum(r.duration)

Вот пример в консоли:http://console.neo4j.org/r/irm0zy

Помните, что match расширяет и where подтягивает результаты.Вы также можете сделать это с помощью match, но вам нужно указать c в start.

Хороший способ проверить, что делают ваши агрегатные функции, — это вернуть все ваши именованные переменные (или установить путь, по которому вы можете вернуться) — таким образом вы увидите агрегацию, разделенную на промежуточные итоги.Вот так:

start a=node(1) 
match a-[r:TALKED_TO]->b-[:KNOWS]->c 
return sum(r.duration), a,b,c;
+-----------------------------------------------------------------------------------------------+
| sum(r.duration) | a                       | b                       | c                       |
+-----------------------------------------------------------------------------------------------+
| 20              | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[4]{name:"person4"} |
| 20              | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[3]{name:"person3"} |
| 20              | Node[1]{name:"person1"} | Node[5]{name:"person5"} | Node[6]{name:"person6"} |
+-----------------------------------------------------------------------------------------------+
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top