2012-12-24 5 views
1

Je suis en train d'exécuter la requête Cypher suivante sur la version Neo4j 1.9M02L'utilisation Neo4j PAR DISTINCT et ORDER sur des propriétés différentes

START me=node(2) 
      MATCH me-[:FOLLOWS]->friends 
      ,friends-[fr:ADDED|STOCKS]->products 
      ,me-[r?]->products 
      WHERE r is null 
      RETURN products._id 
      ORDER BY fr.CreatedOn DESC 
      SKIP 0 
      LIMIT 10 

Je compte obtenir tous les produits qui sont ajoutés ou stockés par mes amis qui ne sont pas AJOUTÉ ou STOCKÉ par moi, commandé par le temps de création de la relation. Cette requête renvoie des résultats corrects mais a des valeurs dupliquées products.id (un utilisateur a AJOUTÉ le produit et un autre utilisateur STOCKED). Mais j'ai besoin qu'une seule instance de ce products._id donc j'ai essayé

START me=node(2) 
      MATCH me-[:FOLLOWS]->friends 
      ,friends-[fr:ADDED|STOCKS]->products 
      ,me-[r?]->products 
      WHERE r is null 
      RETURN DISTINCT products._id 
      ORDER BY fr.CreatedOn DESC 
      SKIP 0 
      LIMIT 10 

(Ajout de la DISTINCT pour products._id) Mais cette fois je suis arrivé Unknown identifier fr erreur. J'ai donc ajouté fr à l'instruction RETURN

START me=node(2) 
      MATCH me-[:FOLLOWS]->friends 
      ,friends-[fr:ADDED|STOCKS]->products 
      ,me-[r?]->products 
      WHERE r is null 
      RETURN DISTINCT products._id,fr 
      ORDER BY fr.CreatedOn DESC 
      SKIP 0 
      LIMIT 10 

Cette requête fonctionne sans erreur mais renvoie les ID de produit en double comme précédemment.

Je joue seulement avec neo4j depuis quelques jours, donc pas du tout expert. J'apprécierais vraiment que quelqu'un puisse m'aider ici.

+0

Salut, eu un cas avec console.neo4j.org afin que nous puissions avoir un exemple et jouer du violon? –

+0

Bonjour Peter, malheureusement, je n'ai aucun exemple. Et je suppose que cela prendra des années pour que j'importe ma base de données sur console.neo4j. Une question, y aura-t-il un problème de sécurité si je publie mon serveur neo4j ici? Ce ne sont pas des données en direct, seulement des dev. – Optimus

Répondre

7

J'ai créé un little case avec console.neo4j.org

Avec la requête suivante, je reviens [4, 3, 2, 4, 3, 2, 4, 3 ,2]:

START me=node(1) 
MATCH me-[:FOLLOWS]->friends 
,friends-[fr:ADDED|STOCKS]->products 
,me-[r?]->products 
WHERE r is null 
with distinct products._id as id, fr.CreatedOn as CreatedOn 
ORDER BY CreatedOn DESC 
RETURN id 

Mettre distincte sur la dernière ligne, et je reviens [3, 4, 2]:

START me=node(1) 
MATCH me-[:FOLLOWS]->friends 
,friends-[fr:ADDED|STOCKS]->products 
,me-[r?]->products 
WHERE r is null 
with distinct products._id as id, fr.CreatedOn as CreatedOn 
ORDER BY CreatedOn DESC 
RETURN distinct id 

Il semble que la commande se perde avec distinct.

EDIT

Après le dépôt an issue on github à ce sujet, il ne prend point de temps avant que je sois un answer.

La suggestion dans la réponse a été d'exécuter cette requête:

START me=node(1) 
MATCH me-[:FOLLOWS]->friends-[fr:ADDED|STOCKS]->product, 
WHERE not(me-->product) 
RETURN product._id as id, min(fr.CreatedOn) as CreatedOn 
ORDER BY CreatedOn DESC 

J'ai modifié la requête afin qu'il ne retourne que les ids:

START me=node(1) 
MATCH me-[:FOLLOWS]->friends-[fr:ADDED|STOCKS]->product 
WHERE not(me-->product) 
WITH product._id as id, min(fr.CreatedOn) as CreatedOn 
ORDER BY CreatedOn DESC 
RETURN id 

Et le tour est joué, il retourne [4, 3, 2]! (J'ai également créé un updated test case.)

+0

Merci beaucoup pour la création de l'affaire!Il semble ORDER BY est ignoré. Si je change le DESC en ASC, j'ai toujours le même résultat. – Optimus

+1

Peut-être un bug? Vous pouvez enregistrer un problème sur https://github.com/neo4j/neo4j/issues –

+0

Oui, merci de bien vouloir signaler un problème, avec l'exemple de console fourni, très apprécié! –

0

En utilisant la fonction d'agrégation MIN, vous pouvez extraire la date CreatedOn la plus ancienne. Une fois que vous avez ce, simple pour le résultat fixé par la première date, comme celui-ci:

START me=node(1) 
MATCH me-[:FOLLOWS]->friends-[fr:ADDED|STOCKS]->product, 
WHERE not(me-->product) 
RETURN product._id as id, min(fr.CreatedOn) as CreatedOn 
ORDER BY CreatedOn DESC 

Hth,

Andrés

Questions connexes