Pergunta

Gostaria de determinar a porcentagem relativa da duração da conversa com vizinhos que conhecem uma pessoa específica.

Por exemplo, ao observar o nó A primeiro temos que saber quanto tempo ele gastou conversando com todos os seus vizinhos, o que é executado com a seguinte consulta:

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

Em seguida, temos que verificar quais de seus vizinhos conhecem uma pessoa específica (digamos c) e somar apenas as durações das conversas entre a e b onde b conhece 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

O que aqui não parece lógico é que a segunda soma é maior que a primeira, enquanto a segunda deve ser apenas a parte da primeira.Alguém sabe qual poderia ser o problema para obter esse resultado?O erro apareceu em 7 usuários entre 15.000.

Foi útil?

Solução

Você não está olhando para uma pessoa específica C nessa consulta.Você está combinando todos os caminhos com qualquer relacionamento :KNOWS, portanto, se você tiver a->b->c e a->b->d, sua duração entre a->b será contada duas vezes.

O que você provavelmente precisará fazer é o seguinte:

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)

Aqui está um exemplo no console:http://console.neo4j.org/r/irm0zy

Lembre-se disso match amplia e where aperta os resultados.Você também pode fazer isso com match, mas você precisa especificar c em start.

Uma boa maneira de testar o que suas funções agregadas estão fazendo é retornar todas as variáveis ​​nomeadas (ou definir um caminho que você possa retornar) - desta forma você verá a agregação separada em subtotais.Igual a:

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"} |
+-----------------------------------------------------------------------------------------------+
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top