Je veux savoir si une liste "A" a déjà été triée par ses valeurs (dans un ordre strictement croissant). J'ai pensé faire une copie de la liste (=> "B") et la comparer à "A" triée par ses valeurs (en utilisant ASC
). Dans l'état actuel, je n'ai aucune idée de comment créer une copie d'une liste. Il existe peut-être un autre moyen plus simple de résoudre ce problème (en utilisant Cypher).
3 Réponses :
Il existe des fonctions de collecte dans les procédures APOC qui peut vous aider, en particulier apoc.coll.sort ()
et apoc.coll.sortNodes ()
selon qu'il s'agit de valeurs primitives ou de nœuds .
Quant à la création d'une copie de liste, vous pouvez utiliser une compréhension de liste pour effectuer une projection des éléments d'une liste comme ceci:
WITH [1,2,3,4,5] as list1 WITH list1, [n in list1 | n] as list2 ...
En ce qui concerne les comparaisons , les comparaisons d'égalité entre les listes incluent l'ordre, donc pour ce qui précède, RETURN list1 = list2
serait vrai puisqu'elles contiennent les mêmes éléments dans le même ordre. Mais mélanger l'une des listes comme ceci: RETURN list1 = apoc.coll.shuffle (list2)
renverrait false car l'ordre est différent.
Si vous ne voulez pas / ne pouvez pas utiliser APOC, vous pouvez trier la liste en utilisant
WITH [1,2,3,4] as list WITH reduce(result = true, i in range(0,size(list)-2) | result AND list[i] <= list[i+1]) AS sorted return sorted
C'est un peu maladroit car vous devez transférer toutes les variables dont vous avez besoin dans toutes les instructions WITH
.
Exemple:
âââââââââââ¤ââââââââââ¤ââââââââââââââ â"list" â"sorted" â"list=sorted"â âââââââââââªââââââââââªââââââââââââââ¡ â[1,2,3,1]â[1,1,2,3]âfalse â âââââââââââ´ââââââââââ´ââââââââââââââ
renvoie
WITH [1,2,3,1] as list UNWIND list as item WITH list,item ORDER BY item WITH list,collect(item) as sorted return list,sorted,list=sorted
Cependant
âââââââââââ¤ââââââââââ¤ââââââââââââââ â"list" â"sorted" â"list=sorted"â âââââââââââªââââââââââªââââââââââââââ¡ â[1,2,3,4]â[1,2,3,4]âtrue â âââââââââââ´ââââââââââ´ââââââââââââââ
renvoie
WITH [1,2,3,4] as list UNWIND list as item WITH list,item ORDER BY item WITH list,collect(item) as sorted return list,sorted,list=sorted
Ou vous pouvez utiliser la fonction réduire
, ceci évite de trier la liste et effectue une itération sur la liste une seule fois:
UNWIND list as item WITH list,item ORDER BY item
Vous pouvez tester directement la liste
d'origine, ce qui devrait être plus rapide et utiliser moins de ressources que de faire un nouveau tri et / ou de créer une copie de la liste.
Par exemple, cela retournera true
:
WITH [1,2,3,4] AS list RETURN ALL(i IN RANGE(1, SIZE(list)-1) WHERE list[i-1] <= list[i]) AS inOrder
Et si list
était [4,1,2,3] code >, alors la requête ci-dessus renverrait
false
.