问题描述
我对此有另一个建议,有人建议这样做
MATCH (p:Person {person_id: '123'})
WHERE ANY(x IN $names WHERE
EXISTS((p)-[:BELONGS]-(:Face)-[:CORRESPONDS]-(:Image)-[:HAS_ACCESS_TO]-(:Dias {group_name: x})))
MATCH path=(p)-[:ASSOCIATED_WITH]-(:Person)
RETURN path
这满足了我的需要,返回了符合条件的节点而没有返回关系,但是现在我需要包括另一个参数,即列表。
....(:Dias {group_name: x,second_name: y}))
我不确定语法。这是我尝试过的
WHERE ANY(x IN $names and y IN $names_2 WHERE..
解决方法
由于ANY()
函数只能对单个列表进行迭代,因此很难继续将其用于2个列表的迭代(但是如果您创建一个包含所有可能的{{1 }}组合),而且效率很高(因为每种组合都需要单独测试)。
但是,neo4j 4.0中引入的新existenial subquery synatx对于此用例将非常有用(我假设2个列表作为参数x/y
和names1
传递):
names2
另外,这里还有一些提示:
- 如果可以在查询中指定每个关系的方向,则将有助于加快查询速度。
- 如果可以从(子)查询中删除任何节点标签,但仍然获得相同的结果,那也将更快。但是,有一个例外:如果(子)查询没有已经绑定到某个值的变量,那么您通常希望为将用于启动该(子)查询的一个节点指定节点标签。 (您可以做一个PROFILE来查看将是哪个节点)。