Neo4j 如何在属性值中表示逻辑OR?

Neo4j 如何在属性值中表示逻辑OR?,neo4j,cypher,Neo4j,Cypher,在这个查询中,如果我想表达“包含网络|手机|智能”,如何修改查询?这就是逻辑“或”的价值 编辑: 我对此进行了测试,但不起作用: MATCH (s:Product {id:'5001207'})-[r]-> (o) WHERE (o:ProdAttrs) AND any(key in keys(o) WHERE toLower(key) contains 'Network') return o 非重新版本可以工作。有错误吗?没有语法错误。它只是没有从中返回预期的结果 编辑2: 生成查询的

在这个查询中,如果我想表达“包含网络|手机|智能”,如何修改查询?这就是逻辑“或”的价值

编辑:

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

MATCH (s:Product {id:'5001207'})-[r]-> (o) WHERE (o:ProdAttrs) AND any(key in keys(o) WHERE toLower(key) contains 'Network') return o
非重新版本可以工作。有错误吗?没有语法错误。它只是没有从中返回预期的结果

编辑2:

生成查询的My函数:

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
公共字符串查询\u部分\u匹配(字符串skuid,列表属性键){
返回“匹配(s:Product{id:'”+skuid+“})-[r]->(o)”+
“哪里”+
“(o:ExAttrs或o:ProdAttrs)和”+
“任意(输入键(o),其中键=~”(?i)。*(“+attrKey+”).*)”+
“返回o”;
}

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

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

public String query_partial_match(String skuid, List<String> attrKey) {

        return "MATCH (s:Product {id:'" + skuid + "'})-[r]-> (o) " +
                "WHERE " +
                "(o:ExAttrs OR o:ProdAttrs) AND " +
                "any(key in keys(o) WHERE key =~'(?i).*(" + attrKey + ").*') " +
                "return o";
    }

一个选项是使用正则表达式测试多个备用字符串值

MATCH (s:Product {id:'5001207'})-[r]->(o:ProdAttrs) 
WHERE any(key in [prop in keys(o) | toLower(prop)] WHERE key contains 'network' OR key contains 'phone' OR key contains 'smart') 
RETURN o
(?i)
启用大小写不敏感

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

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

由于使用了
toLower()
,“网络”、“电话”和“智能”字符串必须使用小写,否则查询将永远不会匹配任何内容。修复了此问题,但没有匹配。此RE看起来与“包含”具有相同的效果。它相当于多个包含(或在一起),但它一步完成,而且它不需要您事先将每个键都转换为小写。而且它也不要求您将测试的所有目标字符串都小写。此外,还可以在同一个查询中生成正则表达式(例如,如果您将目标字符串列表作为参数传递)。这正是我需要的!我必须传递一个参数列表。我的答案在早些时候更新过,以显示如何传递。你有一个输入错误。使用
(?i)
代替
(?!)
。而且不需要使用此查询将“Network”或“Phone”小写。没错!!!这个问题是关于如何在一个密码查询中执行多个or的。您的EDIT 2实际上应该是一个关于如何在Java中向密码查询传递参数的新问题,因此请创建一个新问题(包括您正在使用的Java驱动程序或API)。
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;