neo4j cypher - 如何查找与节点列表有关系的所有节点

his*_*aya 8 neo4j

我有节点 - 命名为"选项"."用户"选择这些选项.我需要一个像这样工作的chpher查询:

检索选择了作为列表给出的所有选项的用户.

MATCH (option:Option)<-[:CHOSE]-(user:User) WHERE  option.Key IN ['1','2','2'] Return user
Run Code Online (Sandbox Code Playgroud)

此查询为我提供了选择选项(1),选项(2)和选项(3)的用户,并且还为我提供了仅选择选项(2)的用户.

我需要的只是选择所有选项的用户 - 选项(1),选项(2)和选项(3).

jja*_*erg 10

对于所有密码解决方案(不知道它是否比Chris的答案更好,您将需要进行测试和比较)您可以option.Key为每个用户收集并过滤掉option.Key列表中每个值没有的人

MATCH (u:User)-[:CHOSE]->(opt:Option)
WITH u, collect(opt.Key) as optKeys
WHERE ALL (v IN {values} WHERE v IN optKeys)
RETURN u
Run Code Online (Sandbox Code Playgroud)

或匹配其列表中的所有选项以及选择它们的用户,按用户收集这些选项,并将选项集的大小与列表的大小进行比较(如果您没有在列表中给出重复项用户)使用相同大小的选项集合选择了所有选项)

MATCH (u:User)-[:CHOSE]->(opt:Option)
WHERE opt.Key IN {values}
WITH u, collect(opt) as opts
WHERE length(opts) = length({values}) // assuming {values} don't have duplicates
RETURN u
Run Code Online (Sandbox Code Playgroud)

要么将结果限制为与{values}中指定了键值的所有选项相关联的用户,并且可以在不更改查询的情况下改变集合参数的长度.