2013-03-26 145 views
1

我正在建模有一些層次關係(作爲父母關係),但另外一些非等級關係的一組節點。neo4j密碼匹配查詢匹配層次關係

比方說,這是一個家庭樹,以每個人的出生國的關係,爲簡單起見

因此,每個出生的國家是一個節點,每個人都是一個節點,我也許可以在暗號由於工作的關係:

start parent=node(123), child=node(456) 
create parent-[:PARENT]->child; 

start person=node(123), country=node(789) 
create person-[:BORN_IN]->country; 

我想要做的是,例如,得到鄉親們的名單沒有來自英國的任何祖先誰什麼,或者FOL有來自日本祖先的ks等。我覺得這應該是一個合理的查詢,但我對cypher很陌生,並且不知道如何構建它。

更新** 後的情況下更廣泛的測試,我發現,查詢不正確的一些工作完全。鑑於一名父母來自英格蘭的父母和一名不是來自英格蘭的祖父母的孩子,沒有任何來自英​​格蘭的祖先的兒童的詢問不正確地將該孩子帶回來自英格蘭的父母。它看起來像我編寫查詢的方式,我得到了與英格蘭有NULL關係的祖父母的回報。我的查詢如下:

START n=node(*), ancestor=node(123) 
MATCH n-[r:PARENT*]->o-[b?:BORN_IN]->ancestor 
WHERE b IS NULL 
RETURN DISTINCT n; 

如果所有人的祖先出生在有問題的國家,它工作正常。

回答

4

您可以使用可變長度關係來包含所有子/祖先。我只挑「人誰也有一個祖先來自日本的」:

START country=<lookup Japan> 
match (child)-[:PARENT*0..5]->(parent)-[:BORN_IN]->(country) 
return child 

注:沒有嘗試過,但在邏輯上這應該這樣做。此外,我選了5

MATCH a-[:PARENT]->b-[:BORN_IN]->z 

隨機深度在您的例子中提到應該找到(一)誰擁有出生在Z A父

如果你有一個數據集方便在控制檯上所有的人.neo4j.org也許可以看看發生了什麼。

+0

謝謝,這工作完美。我的示例查詢的問題最終成爲我粗暴指責rel名稱。 – Paul 2013-03-27 01:34:33