Comment puis-je trouver la valeur d'index d'une chaîne dans une liste - par exempleTrouver la position de chaîne dans une liste Neo4j, Cypher
WITH split ("what is porsche",' ')
comment pourrais-je trouver la position de « porsche » en 3 ?
Comment puis-je trouver la valeur d'index d'une chaîne dans une liste - par exempleTrouver la position de chaîne dans une liste Neo4j, Cypher
WITH split ("what is porsche",' ')
comment pourrais-je trouver la position de « porsche » en 3 ?
Tout d'abord, la position serait 2 car nous commençons généralement à 0 dans CS.
C'est une doublure:
WITH split ("what is porsche",' ') AS spl
RETURN [x IN range(0,size(spl)-1) WHERE spl[x] = "porsche"][0]
Retours 2
WITH split ("what is porsche",' ') AS spl
RETURN [x IN range(0,size(spl)-1) WHERE spl[x] = "is"][0]
Retours 1
Cypher n'a pas de fonction IndexOf-like
en mode natif. Mais vous pouvez installer APOC Procedure et utiliser la fonction apoc.coll.indexOf
, comme ceci:
WITH split ("what is porsche",' ') AS list
RETURN apoc.coll.indexOf(list, 'porsche')
Le résultat sera:
╒════════════════════════════════════╕
│"apoc.coll.indexOf(list, 'porsche')"│
╞════════════════════════════════════╡
│2 │
└────────────────────────────────────┘
Note: Le résultat est 2 parce que les indices commencent à 0.
Note 2: N'oubliez pas d'installer les procédures APOC selon la version de Neo4j que vous utilisez. Jetez un oeil dans le version compatibility matrix.
EDIT:
Une approche alternative sans recourir aux procédures APOC, en utilisant size(), reduce() et range() fonctions avec CASE expression:
WITH split ("what is porsche",' ') AS list
WITH list, range(0, size(list) - 1) AS indexes
WITH reduce(acc=-1, index IN indexes |
CASE WHEN list[index] = 'porsch' THEN index ELSE acc + 0 END
) as reduction
RETURN reduction
Dans le cas où l'indice ne se trouve pas alors -1 retournera .
Je travaillais aussi sur la fourniture d'une solution à Cypher vanille avec compréhensions de liste, mais tu me bats à lui. Génial! –
Comme Bruno dit, APOC est le bon choix pour cela, mais si pour une raison que vous vouliez trouver la position sans APOC, vous pouvez passer par le rigamarole suivant ...
WITH split("what is porsche",' ') AS porsche_strings
UNWIND range(0,size(porsche_strings)-1) AS idx
WITH CASE
WHEN porsche_strings[idx] = 'porsche' THEN idx + 1
END AS position
RETURN collect(position) AS positions
Une autre approche pour la mise en œuvre de cette en Cypher clair:
WITH 'porsche' AS needle, 'what is porsche' AS haystack
WITH needle, split(haystack, ' ') AS words
WITH needle, [i IN range(0, length(words)-1) | [i, words[i]]] AS word
WITH filter(w IN word WHERE w[1] = needle) AS res
RETURN coalesce(res[0][0], -1)
Les deux alternatives étaient brillantes; cependant le premier par Bruno a pris 1ms et le second a pris 18 ms. Encore une fois, je suis très impressionné! – ugp
Merci d'avoir accepté et accepté ceci, mais je ne pense pas que ce soit la réponse acceptée :-). Utilisez APOC si vous le pouvez. –
Je viens d'utiliser le one-liner pour l'instant - fonctionne bien! – ugp