MATCH... COUNT... SKIP... LIMIT

40 views
Skip to first unread message

frednotet

unread,
Dec 11, 2014, 8:49:52 AM12/11/14
to neo...@googlegroups.com
Bonjour,

Je rencontre un petit problème pour lequel mes recherches n'ont guère donné de résultats. Je m'explique: j'ai une banque de données volumineuse que j'interface sous la forme de tableau d'édition. Les données composant un tableau unique étant nombreuses (minimum 1000, maximum 1 millions de données); je me dois de faire une pagination et je n'arrive pas à obtenir facilement le nombre total de nodes trouvés.

Je prends un exemple de nodes :Property (953 éléments "seulement")

MATCH (p:Property) RETURN p.uid, p.name, COUNT(*) AS total SKIP 0 LIMIT 30

==> 130ms MAIS "total" vaut toujours 1

MATCH (p:Property), (k:Keyword) RETURN p.uid, p.name, COUNT(k) AS total SKIP 0 LIMIT 30

==> "total" vaut bien 953 MAIS le traitement dure 4034ms 

(en sachant que p = k puisque chaque "node" ciblé possède 2 labels (un "Property" et un + spécifique, ici dans ce cas "Keyword")

- J'ai trouvé un post sur stackoverflow qui concerne +- le problème : http://stackoverflow.com/questions/17725746/how-to-get-total-rows-for-cypher-with-skip-limit

Par contre, avec la réponse donnée, je n'arrive pas à transposer pour un simple "MATCH" sans paramètres/liaisons.

- J'ai recherché dans la doc officielle, mais il n'y a que des exemples d'un SKIP/LIMIT seul ou d'un COUNT seul; jamais d'exemples "combinés". Ca me parait pourtant une fonctionnalité assez habituelle.

Alors oui, je pourrais faire 2 requêtes distinctes (un simple COUNT) pour obtenir le nombre total et ensuite un MATCH/SKIP/LIMIT pour obtenir les résultats... mais je préfère si possible combiner cela en une seule requête (à moins que ce soit une mauvaise idée), à la manière du SQL_CALC_FOUND_ROWS/FOUND_ROWS en mysql... 

Merci de votre aide...

Fred.

Christophe Willemsen

unread,
Dec 11, 2014, 9:07:07 AM12/11/14
to neo...@googlegroups.com
Salut,

Les aggrégations se font en inline, cela porte pas mal de confusions je sais, et j'ai dur à expliquer vraiment pourquoi :)

Voici un exemple qui modifie ta première requête :

MATCH (n:Profile)
WITH collect(n) as profiles, count(n) as total
UNWIND profiles as profile
RETURN profile, total
SKIP 0
LIMIT 30

frednotet

unread,
Dec 11, 2014, 9:17:53 AM12/11/14
to neo...@googlegroups.com
Super, merci ! 112 ms pour le résultat désiré... J'étais passé outre le COLLECT/UNWIND car je ne pensais pas devoir l'utiliser dans ce cas "basique"... En effet, ca complique un peu mais bref :)


Christophe Willemsen

unread,
Dec 11, 2014, 10:23:34 AM12/11/14
to neo...@googlegroups.com
112 ms cela reste élevé je trouve. Sauf si tu utilises le browser pour tester les requêtes.
Reply all
Reply to author
Forward
0 new messages