2017-10-16 38 views
2

我想将数组存储到Neo4j数据库中,在知道数组字段类型之前,我将数组存储为逗号分隔的文本字段,并使用正则表达式查找具有特定项目的节点! 现在我想保存数组作为数组字段,但我不能用“IN”关键字写一个不区分大小写的条件! 还有就是我在CS-文本字段中找到正则表达式:在数组字段中区分大小写的搜索

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

我存储的数据是这样的:

One_Resource,Another_Resource,... 

而且结果是正确的,但我已经在抓取这个模型和阵列领域中的一些问题在检索中更好。

你有任何建议或方法来解决这个问题?

这是我对阵列场暗号:

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

而与此发现:

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

但是,这是区分大小写:(

感谢

+0

你知道[**我旗**](HTTP://www.regular- expressions.info/modifiers.html)。请看看它。这是你需要的 – Mandy8055

+0

我在我的正则表达式中使用了“i标志”:'(?i)(?:。*,| ^)one_resource(?:,。* | $)',但正如我所知在数组字段中可以不使用正则表达式! –

回答

1

我创办我的答案在书中:Learning Cypher

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

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

现在可以使用正则表达式来寻找想要的节点。

有四个集合谓词。它们分别是:

  • ANY:如果集合中的所有项目遵守规则
  • 这个谓词返回TRUE:如果集合中的至少一个项目坚持 来表达
  • ALL这个谓词返回TRUE
  • NONE:此断言,如果集合中没有项目符合规则
  • 单个返回TRUE:该谓词返回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