2016-11-08 36 views
1

我有一個由兩種節點類型組成的圖模型。每個用戶通過DEPDATA節點(它擁有關係上的重要信息)對一個或多個用戶具有依賴性。與可選圖形部件匹配

(:USER)-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER) 

此鏈中可以有無限長的,所以部分

-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER) 

可以重複n次。這也可能是用戶有沒有關係,所以這一切都是有效

(:USER) 
(:USER)-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER)-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER) 

我想取回是依賴於特定的用戶節點上,無論在深度至極所有用戶節點。

我已經在這裏閱讀了關於可變關係長度http://graphaware.com/graphaware/2015/05/19/neo4j-cypher-variable-length-relationships-by-example.html,但它似乎只適用於直接關係。

如何讓圖結構的整個部分匹配0..n倍?

+0

爲什麼要存儲在一個特定的節點的「顯著信息」,而不是在直接關係?如果你是,你可以使用變長的關係。 –

+0

AFAIK我只能在關係中存儲簡單的數據類型,而不是我自己的複雜Java類。 – Frank

+0

我不明白你的意思。節點和關係支持相同的屬性值。你在哪個版本的Neo4j上? –

回答

1

您使用n作爲您的上限,但您說鏈可能是無限長。在這種情況下,如果你沒有應用上限,那麼你不需要爲它設置一個變量。

我想你要尋找的是這樣的事情(使用ID屬性作爲一個佔位符,但是你唯一標識依賴用戶節點):

MATCH (dep:User{ID:123})<-[:DEPENDS_ON|FOR*0..]-(u:User) 
RETURN DISTINCT u 

這將匹配零個或多個以下鏈:DEPENDS_ON或:對於關係,找到所有不同的依賴用戶。

+0

謝謝,但我不認爲這符合要求。 USER和DEPDATA是兩種不同的節點類型,並且圖的可變部分是通過它們中的每一個「 - [:DEPENDS_ON] - >(:DEPDATA) - [:FOR] - >(:USER)」的關係。我在這裏看不到DEPDATA是如何考慮的。 – Frank

+0

關於變量關係匹配的事情是路徑中的中間節點無關緊要。此匹配將返回任何:可通過遍歷達到的用戶節點:DEPENDS_ON和:對於關係,無關緊要的是:沿該路徑存在DEPDATA節點(或任何其他標籤的任何其他節點)。試一試。 – InverseFalcon

+0

這真的很有用,很好,thx – Frank

0

如果您想要在單獨集合中的「根」節點處開始的每個「完整」路徑的結果,應執行以下操作。 (A「全」路徑是一個在一端具有根節點,並且在另一一個「葉」節點。)

MATCH p=(u:USER)-[:DEPENDS_ON|FOR*0..]->(root:USER {id: 111}) 
WHERE NOT()-[:FOR]->(u) 
RETURN [n IN NODES(p) WHERE n:USER] AS path_nodes;