2014-09-30 73 views
0

我正在使用neo4j 2.1.4社區版。我創建了一些節點和關係如下。 enter image description here在單個密碼查詢中添加新節點和關係

現在我想acheive以下任務: 我有喜歡的ID,姓名,CREATED_DATE日期和結束日期的屬性節點(紫色節點)。並且它的關係屬性爲flag:ACTIVE 1)我想在橙色節點和黃色節點之上添加一個節點,也就是說,新創建的節點將像紫色節點的並行節點,橙色和黃色之間的關係爲HAS顏色節點,其關係屬性爲Status:ACTIVE。 3)同樣,現有的紫色節點關係屬性Status:'ACTIVE'應更改爲INACTIVE,並且紫色節點的END_Date應成爲新創建的節點的Created_Date

這些我想在單個查詢中獲得成功。

我寫了下面的查詢來實現這一點。我可以使用created_date創建一個新節點,但無法創建關係。我不確定它出錯的地方。

查詢:

MERGE (og:OperatingGroup {OperatingGroup_ID:'NOP',OpeartingGroup_Name:'Operating'}) 
ON CREATE SET og.GOG_Start_Date= timestamp() 
WITH og 
MATCH (h:Hierarchy {Hierarchy_ID:181,Hierarchy_Name:'Global Property Hierarchy'}) 
Create (h)-[:HAS]->(og) 
return h,og; 

事情未在上面的查詢實現的是: 1)創建具有屬性 2關係)更新在舊節點的END_DATE(紫色節點) 3)更新舊節點的關係屬性爲INACTIVE

那麼如何在單個密碼查詢中查看所有這些事情?

感謝

回答

0

你應該嘗試你的話翻譯成一個查詢,或先繪製在紙上或白板。

首先你要「匹配」一個節點,那麼你爲什麼要從「MERGE」開始?

MATCH (purple:Purple {id:123}) 
WITH purple 

其次,你也許想連接到紫節點橙色節點和黃色的節點,因爲你的新節點應該像parrallel,你也應該爲你想給一個別名的關係後來修改的關係屬性:

MATCH (orange:Orange)-[purpleToOrange:HAS]-(purple)-[purpleToYellow:HAS]-(yellow:Yellow) 
WITH purple, orange, yellow, purpleToOrange, purpleToYellow 

然後,你需要創建新的節點,並連接到它的黃色和橙色的節點,相關節點已界,查詢,以便您可以使用「合併」,並避免複製黃色和橙色節點:

MERGE (orange)-[:HAS]->(newPurple:Purple {id: 789654, created_at:20140930140925})<-[:HAS]-(yellow) 

最後,您希望將關係屬性狀態和end_date從原始紫色節點更新爲?(在你的描述中沒有規定,所以我會紫色和橙色之間的假設)

SET purpleToOrange.status = "INACTIVE", 
SET purpleToOrange.endDate = 20140930140925 

然後你也許想返回新創建的紫色節點:

RETURN newPurple 

所以完整的查詢現在:

MATCH (purple:Purple {id:123}) 
WITH n 
MATCH (orange:Orange)-[purpleToOrange:HAS]-(purple)-[purpleToYellow:HAS]-(yellow:Yellow) 
WITH purple, orange, yellow, purpleToOrange, purpleToYellow 
MERGE (orange)-[:HAS]->(newPurple:Purple {id: 789654, created_at:20140930140925})<-[:HAS]-(yellow) 
SET purpleToOrange.status = "INACTIVE", 
SET purpleToOrange.endDate = 20140930140925 
RETURN newPurple 
+0

@ Christophe,在查詢我寫了MERGE爲了創建一個新的節點。在上圖中,我沒有顯示新創建的節點。我想要在第二級創建該節點。所以我想創建具有屬性的節點。然後想要與一級和三級節點建立關係。這裏橙色是1級,紫色級2,黃色級3,綠色級4。所以在創建新節點後,我將在2級中擁有2個prple節點。 – shree11 2014-10-01 04:49:45

+0

那麼我的查詢在第二個級別中創建了新的紫色節點,在橙色和黃色之間,我首先開始匹配原始紫色節點,原因有兩個, 1.你在圖中定義了一個明確的起點,所以沒有全局圖遍歷導致更快的查詢,2.你可以訪問與紫色節點相關的橙色和黃色節點,所以你事先知道你的位置新節點應該連接。 – 2014-10-01 06:20:10

0

你想要做了很多與一個單一的查詢,但我認爲這將做到這一點:

MATCH (h:Hierarchy {Hierarchy_ID:181,Hierarchy_Name:'Global Property Hierarchy'}) 
MERGE (h)-[:HAS{status;'ACTIVE'}]->(og:OperatingGroup {OperatingGroup_ID:'NOP',OpeartingGroup_Name:'Operating'}) 
ON CREATE SET og.GOG_Start_Date = timestamp() 
WITH h, og 
MATCH (h)-[has:HAS{status:'ACTIVE'}]->(other:OperatingGroup) 
WHERE other <> og 
SET has.status='INACTIVE' 
SET other.GOG_End_Date = og.GOG_Start_Date 
RETURN h, og 

與Hierarchy節點相匹配,即所有內容都已啓動。

MATCH (h:Hierarchy {Hierarchy_ID:181,Hierarchy_Name:'Global Property Hierarchy'}) 

將此狀態與活動狀態關係合併到ID爲'NOP'的OperatingGroup。

MERGE (h)-[:HAS{status;'ACTIVE'}]->(og:OperatingGroup {OperatingGroup_ID:'NOP',OpeartingGroup_Name:'Operating'}) 

如果該組剛剛創建,則設置開始日期。

ON CREATE SET og.GOG_Start_Date = timestamp() 

現在匹配存在的任何其他OperatingGroups及其HAS關係。按要求設置status屬性和endDate(在OperatingGroup節點上,以匹配GOG_Start_Date?)。

WITH h, og 
MATCH (h)-[has:HAS]->(other:OperatingGroup) 
WHERE other <> og 
SET has.status='INACTIVE' 
SET other.GOG_End_Date = og.GOG_Start_Date 
RETURN h, og 

編輯 - OperatingCompany

我從克里斯托弗的回答,他保留OperatingGroup到OperatingCOmpany關係,這雖然不要求確實讓很多的意義看(就是我們操作上的圖形倒掛?)。

MATCH (h:Hierarchy {Hierarchy_ID:181,Hierarchy_Name:'Global Property Hierarchy'})-[existingHas:HAS]->(existingOg:OperatingGroup)<-[belong:BELONGS]-(company:OperatingCompany) 
MERGE (h)-[:HAS{status;'ACTIVE'}]->(og:OperatingGroup {OperatingGroup_ID:'NOP',OpeartingGroup_Name:'Operating'})<-[:BELONGS]-(company) 
ON CREATE SET og.GOG_Start_Date = timestamp() 
WITH h, og, existingHas, exitingOg 
SET existingHas.status='INACTIVE' 
SET existingOg.GOG_End_Date = og.GOG_Start_Date 
RETURN h, og 
相關問題