2015-11-08 60 views
3

我正在使用Neo4j並使用其REST API和Cypher處理數據。
我有以下代碼:Cypher - 使用計算值創建關係

MATCH (u:USER) WHERE id(u) = 10192 
MATCH (uc:USERS_CLUSTER) WHERE id(uc) = 19618 
MATCH (u)-[r1:HAVE]->(i:ITEM)<-[r2:HAVE]-(u2:USER)-[ic:IN_CLUSTER]->(uc) 
OPTIONAL MATCH (u)-[oldic:IN_CLUSTER]->(uc) 
WHERE (u) <> (u2) 
DELETE oldic 
// --> PROBLEM --> CREAT (u)-[:IN_CLUSTER {score: XXXXXXXXX}]->(uc) 
RETURN id(u),u,id(uc),uc, 
// --> VALUE --> 
((avg(abs(2-abs(r1.rank-r2.rank))*(2-abs(r1.rank-r2.rank)))+4)/8)*100 as calcedMatch 
ORDER BY calcedMatch DESC 

有一個值calcedMatch我計算,我可以沒有任何問題返回。但我想要做的是創建一個新的IN_CLUSTER關係,並具有屬性score與calcedMatch(我把XXXXXXXX放在哪裏)的值。那可能嗎?

回答

3

建議不要使用節點的id作爲參考;它在所分配的節點或關係的上下文中不是不可變的(即,當對象被銷燬時它們可以被重用)。

我更新了一下你的查詢。您不需要刪除關係,然後重新創建它。您可以簡單地使用MERGE,如果它不存在,它將創建它。然後你可以在之後設置新的分數。

MATCH (u:USER) WHERE id(u) = 10192 
WITH u 
MATCH (uc:USERS_CLUSTER) WHERE id(uc) = 19618 
WITH uc 
MATCH (u)-[r1:HAVE]->(i:ITEM)<-[r2:HAVE]-(u2:USER)-[ic:IN_CLUSTER]->(uc) 
WHERE (u) <> (u2) 
WITH u, uc, ((avg(abs(2-abs(r1.rank-r2.rank))*(2-abs(r1.rank-r2.rank)))+4)/8)*100 as calcedMatch 
MERGE (u)-[ic:IN_CLUSTER]->(uc) 
set ic.score = calcedMatch 
RETURN id(u),u,id(uc),uc, ic.score 
ORDER BY ic.score DESC 
+1

該ID是不可變的它只是在刪除後重用:) –