Cypher-查找包含搜索数组作为数组属性的所有节点

时间:2019-12-12 13:26:08

标签: neo4j cypher

我有一个搜索数组,例如["name1", "name2"]。在我的数据库中,我有一些节点,这些节点的属性来自“字符串数组”类型,例如:node.users = ["name1", "name2", "name4", "name5"]

我想返回所有包含搜索数组的节点作为“用户”属性(字符串数组)的子集。

我知道我可以使用“ IN”之类的“ searchArray IN node.users”命令在users属性中进行搜索。但这不适用于像我这样的searc数组-仅适用于"name1" IN node.users之类的单个字符串。在这个问题中,我已经抽象了这个问题-实际上,搜索数组更大。现有的解决方法是遍历搜索数组,并用OR合并每个条目,例如(第二行是有趣的部分):

MATCH (parent{id: "f705078c519e494da2821df284f4021e"})-[rel:contains*]->(children) 
WHERE ("name1" IN children.users OR "name2" IN children.users) RETURN parent, rel, children

它出奇地好,但这只是一种解决方法,我认为必须针对此问题提供本机解决方案。

1 个答案:

答案 0 :(得分:2)

为此,您可以使用谓词全部

来自密码refcard:

  

全部(x在哪里存在(x.property))
  如果列表中所有元素的谓词为true,则返回true。

因此您的查询变为(其中$searchArray是数组["name1", "name2"]):

MATCH (parent{id: "f705078c519e494da2821df284f4021e"})-[rel:contains*]->(children) 
WHERE all(x in $searchArray WHERE x IN children.users) 
RETURN parent, rel, children