Cypher - 使用计算值创建关系
Cypher - create relationship using value of calculation
我正在研究 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
我正在计算,我可以 return 它没有任何问题。但我想做的是创建一个新的 IN_CLUSTER 关系,并使 属性 score
具有 calcedMatch 的值(我放置 XXXXXXXX 的位置)。这可能吗?
不建议使用节点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
我正在研究 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
我正在计算,我可以 return 它没有任何问题。但我想做的是创建一个新的 IN_CLUSTER 关系,并使 属性 score
具有 calcedMatch 的值(我放置 XXXXXXXX 的位置)。这可能吗?
不建议使用节点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