Domanda

Vorrei determinare la percentuale relativa della durata della conversazione con i vicini che conoscono la persona specifica.

Ad esempio quando si osserva un nodo un primo dobbiamo sapere quanto tempo ha trascorso a parlare con tutti i suoi vicini che viene eseguita con la seguente query:

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
.

Successivamente dobbiamo verificare quale dei suoi vicini conosca una persona specifica (diciamo c) e sommare solo le durate delle conversazioni tra A e B dove B sa 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
.

Che cosa sembra logica è logica è che la seconda somma è più grande del primo mentre il secondo dovrebbe essere solo la parte del primo.Qualcuno sa cosa potrebbe essere il problema per ottenere tale risultato?L'errore è apparso su 7 utenti su 15000.

È stato utile?

Soluzione

Non stai guardando una persona specifica c in quella query.Stai combinando tutti i percorsi a qualsiasi: Conosce la relazione, quindi se hai A-> B-> C e A-> B-> D La durata tra A-> B verrà contata due volte.

Cosa probabilmente devi fare è questo invece:

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)
.

Ecco un esempio in console: http://console.neo4j.org/r/irm0zy

Ricordare che match Bellens e where stringe i risultati.Puoi anche farlo con match, ma è necessario specificare c in start.

Un buon modo per testare quali sono le tue funzioni aggregate è quella di restituire tutte le tue variabili denominate (o impostare un percorso che puoi tornare) - in questo modo vedi l'aggregazione separata in subtotali.Come così:

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"} |
+-----------------------------------------------------------------------------------------------+
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top