Neo4j:使用列表的替代过滤器(通用方法)



我试图根据适用于常规过滤器的列表进行过滤,只要该列表具有节点的属性,它就会尝试过滤。

UNWIND [{id:'1002',name:'Ford', type:'4-wheel'}] as row
MATCH (c:Car)
WHERE c[head(keys(row))]=row[head(keys(row))]
RETURN c

我的问题是查询过滤为 OR 布尔值而不是 AND 布尔值。(即 reults 返回节点属性的任意组合(。但是,我只想要具有列出所有属性的节点。

您可以尝试将其作为一种方法:

WITH keys({id:'1002',name:'Ford', type:'4-wheel'}) AS required
MATCH (c:Car)
WITH c, required, keys(c) AS toCheck, size(required) AS reqSize
WITH c, reqSize, required + toCheck as matched
UNWIND matched as matchedItems
WITH c, reqSize, matchedItems, COUNT(matchedItems) AS counted WHERE counted > 1
RETURN CASE WHEN size(collect(counted)) = reqSize THEN c ELSE null END

基本上,操作是创建您要查找的键列表,并将其添加到您正在检查的节点中的键列表中。

接下来,按带计数的键名对键名进行分组,仅保留重复的键名,即计数为 2 的键名(如果所需列表和选中列表中的键名在列表中是唯一的,则计数只能为一个或两个(。

第五,如果重复键名称的计数与所需键列表的长度匹配,则节点包含所有必需的键。

您可以在上述查询中减少很多"WITH"。它只是为了展示思维背后的逻辑。

最新更新