2015-09-06 58 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