Cypher - 使用计算值创建关系

时间:2015-11-08 14:46:43

标签: neo4j cypher graph-databases

我正在研究Neo4j并使用他们的REST API和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放在哪里)。这可能吗?

1 个答案:

答案 0 :(得分: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