我正在尝试查找性别不包含字符串"男性"的所有用户。我希望此查询的结果是那些未指定性别的用户。
用户和性别是单独的节点,如下所示连接:
(user node) - [:gender] -> (gender node)
对于某些用户,性别关系不存在
我运行了这个查询:
MATCH (g:genders)
WHERE g.gender =~ ".*male.*"
WITH g MATCH (u:users)
WHERE NOT (u)-[:gender]->(g)
RETURN COUNT(u);
这个查询的问题是它返回我数据库中的所有用户,因为WHERE NOT子句正在进行OR比较而不是AND,即它找到所有性别不是男性或不是女性的用户,这是所有用户在我的数据库中。
如何将其作为AND查询?我想要一个不假设结束节点(在本例中是性别节点)总是只有两个可能值的解决方案。
答案 0 :(得分:2)
此查询是否符合您的意图?
MATCH (u:user)
WITH COLLECT(u) AS cu
UNWIND cu AS u
MATCH (u)-[:gender]->(g:gender) WHERE g.gender =~ ".*male.*"
WITH cu, COLLECT(u) AS cv
RETURN REDUCE(s=[], x IN cu | CASE WHEN NOT x IN cv THEN s + x ELSE s END) AS result;
删除包含"男性"的性别的用户来自用户总数。