2015-09-06 46 views
2

Cypher newb在这里谁可能无法让我的脑袋出“思考SQL”:Cypher:标签语法 ​​- 在使用标签约束节点时使用“OR”?

比方说,我有一个星球大战角色和他们的孩子(和他们的孩子,等等)图。

我在父母和孩子之间有一种关系。如果我想回到所有的天行者阿纳金的后代的节点(包括他,太),我可能做到这一点:

MATCH (x:Person {name:"Darth Vader"})-[: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", "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],对我会假设前WHERE得到应用[:CHILD_OF1..3]被评估)

非常感谢。

+0

做你的意思是标签或属性?你的例子中的'name'是一个属性,':Person'是一个标签。 – jjaderberg

+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 
相关问题