Pregunta

Me gustaría para determinar el porcentaje relativo de duración de la conversación con los vecinos que conocen a una persona específica.

Por ejemplo, al observar el nodo primero tenemos que saber cuánto tiempo pasó hablando con todos sus vecinos, que se ejecuta con la siguiente 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

A continuación tenemos que comprobar que sus vecinos sepan persona específica (es decir c) y suma sólo la duración de las conversaciones entre a y b, donde b sabe que 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

Lo que aquí no parece lógico es que la segunda suma es más grande que el primero, mientras que el segundo se supone que es sólo la parte de la primera.¿Alguien sabe cuál puede ser el problema para obtener ese resultado?El error apareció en 7 de los usuarios de 15000.

¿Fue útil?

Solución

Usted no está buscando a una persona en específico C en la consulta.Estás coincidencia todos los caminos para cualquier :CONOCE la relación, así que si usted tiene un a->b->c y a->b->d su duración entre la a->b se cuentan dos veces.

Probablemente lo que necesitas hacer es esto:

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)

He aquí un ejemplo en la consola:http://console.neo4j.org/r/irm0zy

Recuerde que match se amplía y where aprieta los resultados.También puede hacer esto con match, pero se necesita especificar c en start.

Una buena manera de probar lo que la suma de las funciones que están haciendo es devolver todas sus variables (o establecer una ruta de acceso puede volver)--de esta manera ver la agregación separados en los subtotales.Así:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top