如何表达属性值的逻辑OR?

时间:2018-05-04 20:21:28

标签: neo4j cypher

88 27/04/2018  2018-04-27 13:36:06.000

在此查询中,如果我想表达"包含网络|电话|智能",如何修改查询?这就是逻辑' OR'价值。

编辑:

我对此进行了测试,但它不起作用:

MATCH (s:Product {id:'5001207'})-[r]-> (o) WHERE (o:ProdAttrs) AND any(key in keys(o) WHERE toLower(key) contains 'Network') return o

非RE版本有效。有错误吗?没有语法错误。它只是没有按照预期的那样返回结果。

编辑2:

我的生成查询的功能:

MATCH (s:Product {id:'5001207'})-[r]-> (o) 
  WHERE (o:Attrs OR o:ExAttrs) AND any(key in keys(o) 
   WHERE key =~ '(?!).*(network|phone).*') 
return o

这是我生成查询的Java方法。那么如何使用Java列表' attrKey'在这个查询?

2 个答案:

答案 0 :(得分:1)

只需在WHERE子句中使用OR即可。使用所有小写道具列表可能会有所帮助。

\n

答案 1 :(得分:0)

一种选择是使用正则表达式来测试多个备用字符串值。

MATCH (s:Product {id:'5001207'})-->(o:ProdAttrs)
WHERE ANY(key in KEYS(o) WHERE key =~ '(?i).*(Network|Phone|Smart).*')
RETURN o;

(?i)使案例不敏感。

此外,如果您传入包含目标字符串集合的parameter(例如,$terms)(例如['Network', 'Phone', 'Smart']),则查询可以生成相应的正则表达式。例如:

MATCH (s:Product {id:'5001207'})-->(o:ProdAttrs)
WHERE ANY(key in KEYS(o) WHERE
  key =~ '(?i).*(' + REDUCE(s=$terms[0], t IN $terms[1..] | s + '|' + t) + ').*')
RETURN o;