2015-11-08 56 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是不可变的它只是在删除后重用:) –