【问题标题】:Cypher - create relationship using value of calculationCypher - 使用计算值创建关系
【发布时间】:2015-11-09 14:09:51
【问题描述】:

我正在研究 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 的位置)。这可能吗?

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    建议不要使用节点的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
    

    【讨论】:

    • id 是不可变的,它只是在删除后重用:)
    猜你喜欢
    • 2020-06-22
    • 1970-01-01
    • 2018-01-27
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多