我有一个搜索数组,例如["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
它出奇地好,但这只是一种解决方法,我认为必须针对此问题提供本机解决方案。
答案 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