在数组字段中进行区分大小写的搜索

时间:2017-10-16 07:15:20

标签: arrays regex neo4j cypher

我想将数组存储到Neo4j db中,在了解数组字段类型之前,我将数组存储为逗号分隔的文本字段,并使用正则表达式查找具有特定项的节点! 现在我想将数组保存为数组字段,但我不能用" IN"写一个不区分大小写的条件。关键词! 我的正则表达式可以在cs-text字段中找到:

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

我存储的数据是这样的:

One_Resource,Another_Resource,...

结果是正确的但我在检索此模型时遇到了一些问题,并且数组字段在检索方面更好。

您有解决此问题的建议或方法吗?

这是我的阵列字段Cypher:

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

找到这个:

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

但这是区分大小写的:(

由于

1 个答案:

答案 0 :(得分:1)

我在书中找到了答案:Learning Cypher

必须在WHERE子句中使用ANY (...IN...WHERE...)

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

现在可以使用Regex找到想要的节点。

有四个集合谓词。它们如下:

  • ANY:如果集合中至少有一个项目符合,则此谓词返回TRUE 表达
  • ALL:如果集合中的所有项目都遵守规则
  • ,则此谓词返回TRUE
  • NONE:如果集合中没有项目遵循规则
  • ,则此谓词返回TRUE
  • SINGLE:如果一个项目遵循规则
  • ,则此谓词返回TRUE

如果我们希望所有书籍都标记为NoSQL而不是Neo4j,我们可以使用NONE谓词 如下:

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