Cypher:标签语法 ​​- 在使用标签约束节点时使用“OR”?

时间:2015-09-06 01:57:07

标签: neo4j cypher

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?)

非常感谢。

1 个答案:

答案 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相等匹配的语法糖,只能用于严格的相等。

如果您想知道如何断开连接xy或看到它们之间的节点/关系,您可以定义路径变量:

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