Cypher newb在这里可能无法理解“在SQL中思考”:
假设我有星球大战人物及其孩子(以及他们的孩子等等)的图表。
父母与子女之间存在关系。如果我想要返回Anakin Skywalker所有后代的节点(包括他),我可能会这样做:
MATCH (x:Person {name:"Darth Vader"})-[:CHILD_OF*1..3]-(y)
RETURN x,y
如果我想比较两个角色的后代怎么办?假设我想看到Anakin和令人厌恶的Jar Jar Binks的产卵。有没有办法基本上OR标签约束?
MATCH (x:Person {name:"Darth Vader | "Jar Jar"})-[:CHILD_OF*1..3]-(y)
RETURN x,y
没有
MATCH (x:Person {name:("Darth Vader", "Jar Jar")})-[:CHILD_OF*1..3]-(y)
RETURN x,y
失败。
MATCH (x:Person {name:"Darth Vader"} OR {name: "Jar Jar"})-[:CHILD_OF*1..3]-(y)
RETURN x,y
悲伤。
或者我必须使用一个WHERE子句(会破坏[:CHILD_OF * 1..3],对吗?我假设在[:CHILD_OF1..3]被评估之前应用了WHERE?)
非常感谢。
答案 0 :(得分:2)
是的,您需要使用WHERE
子句。它不应该破坏可变长度路径:
MATCH (x:Person)-[:CHILD_OF*1..3]-(y)
WHERE x.name IN ['Darth Vader', 'Jar Jar']
RETURN x, y
Neo4j非常聪明,知道你说的是“从符合这些标准的x
开始,然后从那里形成路径”。 JSON匹配语法是简单WHERE
相等匹配的语法糖,只能用于严格的相等。
如果您想知道如何断开连接x
和y
或看到它们之间的节点/关系,您可以定义路径变量:
MATCH path=(x:Person)-[:CHILD_OF*1..3]-(y)
WHERE x.name IN ['Darth Vader', 'Jar Jar']
RETURN x, path, nodes(path), rels(path), y
修改强>
如果有帮助,另一种方法/考虑它是使用WITH
条款:
MATCH (x:Person)
WHERE x.name IN ['Darth Vader', 'Jar Jar'])
WITH x
MATCH (x)-[:CHILD_OF*1..3]-(y)
RETURN x,y