2015-09-21 35 views
1

我想創建chyper聲明:創建其創建或更新存在(或不存在)的關係和道具暗號聲明

  1. 如果關係不是兩個節點之間存在我創造它
  2. 修改屬性就可以了。

於是我想出了這一點:

String modifyRelations="match (p1:User),(p2:User) " + 
        "WHERE p1.userId=~{1} and p2.userId=~{2} "+ 
        "MERGE (p1)-[r:follow]->(p2)"+ 
        "SET follow.followType={3}"; 


     final PreparedStatement ps1 = conn.prepareStatement(modifyRelations); 
      ps1.setString(1, sourceNodeDTO.getUserId()); 
      ps1.setString(2, targetNodeDTO.getUserId()); 
      ps1.setString(3, followTypes.getValue()); 

我得到錯誤:

Neo.ClientError.Statement.InvalidSyntax, message=follow not defined 

的事情是,我不希望創建的情況下,它已經存在新的關係。

如果存在,我只想修改其中的屬性(跟隨)。 但是,如果關係不存在,我想創建它並將其設置爲以下屬性

謝謝, ray。

回答

1

[增訂]

回答到原來的問題

它看起來像你唯一絕對需要改變的是你的SET條款。它需要引用它的標識符(r)的關係,而不是它的關係類型:

"SET r.followType={3}"; 

如果一個不存在的MERGE子句只會造成匹配p1p2節點之間的新關係follow。它將匹配(而不是創建)現有的關係,即使它具有附加的屬性鍵/值。

但是,你應該也改變WHERE子句,因爲你的正則表達式沒有爲你做任何事,直接字符串比較也不會做。在Cypher中,正則表達式匹配整個值,並且由於您的正則表達式不使用通配符且不區分大小寫,因此應該只使用簡單的字符串比較。正則表達式也比簡單的字符串比較慢。

String modifyRelations= 
    "MATCH (p1:User), (p2:User) " + 
    "WHERE p1.userId={1} and p2.userId={2} "+ 
    "MERGE (p1)-[r:follow]->(p2)"+ 
    "SET r.followType={3}"; 

答案在評論

來回答的問題,您的後續問題,在下面的意見,此查詢也將創造p1和/或p2如果任尚不存在:

String modifyRelations= 
    "MERGE (p1:User {userId: {1}})" + 
    "MERGE (p2:User {userId: {2}})" + 
    "MERGE (p1)-[r:follow]->(p2)"+ 
    "SET follow.followType={3}"; 
+0

工作。謝謝。您能否請升級此語句並添加相同的查詢,以便在不存在的情況下創建具有關係的兩個節點。 ?如果他們存在只是爲了更新他們的關係,謝謝。 – rayman

+0

您目前在每個'WHERE'子句中使用正則表達式。當創建一個'User'(如果找不到匹配的'User'),你想爲'userId'使用什麼?或者,完全擺脫正則表達式可以嗎? – cybersam

+0

userId是我的圖中的索引。它的主鍵和唯一。在userId不是退出的情況下,我想創建一個新的節點,其中包含該圖形上的userId屬性。其他用戶也一樣(p2) – rayman

0

您混合了變量/標識符(您的情況爲r)和關係類型爲follow

這是一個很好的做法,全部蓋住REL型,那麼它是更明顯。

I.e. FOLLOWS

MATCH (p1:User),(p2:User) 
WHERE p1.userId=~{1} and p2.userId=~{2} 
MERGE (p1)-[r:FOLLOW]->(p2) 
ON CREATE SET SET r.followType={3} 

而且你還可能想使用ON CREATE SET,而不是僅僅簡單的,無條件的SET