Question

Je voudrais déterminer le pourcentage relatif de la durée d'une conversation avec des voisins qui connaissent une personne en particulier.

Par exemple, lorsque nous observons le nœud A, nous devons d'abord savoir combien de temps il a passé à parler à tous ses voisins, ce qui est exécuté avec la requête suivante :

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

Ensuite, nous devons vérifier lequel de ses voisins connaît une personne spécifique (disons c) et additionner uniquement les durées des conversations entre a et b où b connaît 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

Ce qui ici ne semble pas logique, c'est que la deuxième somme est plus grande que la première alors que la seconde est censée n'être qu'une partie de la première.Est-ce que quelqu'un sait quel pourrait être le problème pour obtenir un tel résultat ?L'erreur est apparue sur 7 utilisateurs sur 15 000.

Était-ce utile?

La solution

Vous ne regardez pas une personne spécifique C dans cette requête.Vous faites correspondre tous les chemins à n'importe quelle relation :KNOWS, donc si vous avez a->b->c et a->b->d votre durée entre a->b sera comptée deux fois.

Ce que vous devrez probablement faire à la place est ceci :

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)

Voici un exemple en console :http://console.neo4j.org/r/irm0zy

Rappelez-vous que match s'élargit et where resserre les résultats.Vous pouvez également le faire avec match, mais vous devez spécifier c dans start.

Un bon moyen de tester ce que font vos fonctions d'agrégation est de renvoyer toutes vos variables nommées (ou de définir un chemin que vous pouvez renvoyer) - de cette façon, vous voyez l'agrégation séparée en sous-totaux.Ainsi:

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"} |
+-----------------------------------------------------------------------------------------------+
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top