2017-09-26 1 views

Répondre

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

+0

Je viens d'utiliser le one-liner pour l'instant - fonctionne bien! – ugp

2

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 .

+2

Je travaillais aussi sur la fourniture d'une solution à Cypher vanille avec compréhensions de liste, mais tu me bats à lui. Génial! –

2

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 
2

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) 
+0

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

+2

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. –