2017-10-16 9 views
2

Je veux stocker un tableau à Neo4j db, Avant de connaître les types de champs tableau, j'ai été stocké mon tableau comme un champ de texte séparé par des virgules et utilisé regex pour trouver des nœuds qui ont un élément spécifique! Maintenant, je veux enregistrer tableau en tant que champ de tableau, mais je ne peux pas écrire une condition insensible à la casse avec le mot-clé "IN"! Il est mon Regex pour trouver dans le champ texte cs:Recherche sensible dans les champs tableau

MATCH (user:USER)-[:MEMBER_OF]->(group:SOME_GROUP) where 
group.resources =~ "(?i)(?:.*,|^)one_resource(?:,.*|$)" 
RETURN group 

Mes données stockées était comme ceci:

One_Resource,Another_Resource,... 

et le résultat est correct, mais j'ai quelques questions sur la récupération ce champ de modèle et tableau est mieux en récupération.

Avez-vous une suggestion ou une méthode pour résoudre ce problème?

Ceci est mon Cypher pour le champ de tableau:

MATCH (node {hid:"abc"}) 
SET node.array_field = ["Foo","Bar","Baz","BaG"] 

Et trouver avec ceci:

MATCH (node) WHERE "foo" IN node.array_field RETURN node 

Mais ceci est sensible à la casse :(

Merci

+0

Connaissez-vous (http [** i drapeau **]: //www.regular- expressions.info/modifiers.html).Veuillez regarder. C'est ce dont vous avez besoin – Mandy8055

+0

J'ai utilisé "i flag" dans mon Regex: '(? I) (?:. *, | ^) One_resource (?:,. * | $)', Mais comme je sais dans le tableau tableau peut n'utilisez pas regex! –

Répondre

1

j'ai fondé ma répondre dans le livre: Learning Cypher

Doit utiliser ANY (...IN...WHERE...) dans la clause WHERE:

MATCH (node) 
WHERE ANY (item IN node.array_field WHERE item =~ "(?i)foo") 
RETURN node 

peut maintenant utiliser Regex pour trouver le noeud recherché.

Il existe quatre prédicats de collection. Ils sont les suivants:

  • TOUT: Ce prédicat retourne TRUE si au moins un élément de la collection adhère à l'expression
  • ALL: Ce prédicat retourne TRUE si tous les éléments de la collection adhèrent à la règle
  • NONE: Ce prédicat retourne TRUE si aucun élément de la collection suit la règle
  • SIMPLE: Ce prédicat retourne TRUE si exactement un élément suit la règle

Si nous voulons que tous les livres dans la catégorie NoSQL mais pas Neo4j, nous pouvons utiliser le prédicat NONE comme suit:

MATCH (b:Book) 
WHERE ANY (tag IN b.tags WHERE tag = 'nosql') 
AND NONE (tag in b.tags WHERE tag = 'neo4j') 
RETURN b.title,b.tags