如何根据neo4j 集合中的值创建、更新或删除?

How to create, update or delete according to values in a collection in neo4j?

在 neo4j 中,我在数据库中有 IS_SIMILAR 与 属性 similarity 的关系,并且我有一个包含新信息的集合 collect([node_n, node_m, new_similarity]) AS similarity_table。我想:

  1. 如果关系 (node_n)-[r:IS_SIMILAR]-(node_m) 存在 [node_n, node_m, new_similarity >= 0.5]similarity_table 中,仅 UPDATE 值从 r.similaritynew_similarity
  2. 如果 (node_n)-[r:IS_SIMILAR]-(node_m) 存在 [node_n, node_m, new_similarity < 0.5] similarity_tableDELETE r(因为node_n和node_m不再相似)
  3. 如果关系 (node_n)-[r:IS_SIMILAR]-(node_m) 不存在 [node_n, node_m, new_similarity >= 0.5] similarity_table, CREATE (node_n)-[r:IS_SIMILAR]-(node_m)SET r.similarity = new_similarity
  4. 如果关系 (node_n)-[r:IS_SIMILAR]-(node_m) similarity_table 中不存在 [node_n, node_m, new_similarity < 0.5],什么也不做

使用 MERGE 我可以处理 1+3+4(仅处理 new_similarity >= 0.5 部分):

... # calculate similarity and build n, m, new_similarity list
WITH collect([node_n, node_m, new_similarity]) AS sim_table
WITH [val IN sim_table WHERE val[2] >= 0.5] AS similarity_table
UNWIND similarity_table AS s
WITH s[0] AS n, s[1] AS m, s[2] AS sim
MERGE (n)-[r:IS_SIMILAR_TO]->(m)
SET r.similarity = sim

但是我可以将所有这些条件操作(创建、更新、删除)组合在一个 Cypher 中吗?

我读你的问题的方式你已经计算出新的相似性,现在你想要 node_nnode_m 之间的关系当且仅当 new_similarity > 0.5.

如果是这样,那么最简单的事情就是删除所有现有的相似性,因为这会处理案例 2,根据 new_similarity 值过滤关系对,然后合并关系。在 Cypher 中它看起来像

... # calculate similarity and build n, m, new_similarity list
OPTIONAL MATCH (node_m)-[rel:IS_SIMILAR_TO]->(node_m)
DELETE rel
WITH node_n, node_m, new_similarity // Note that I have removed your collect
WHERE new_similarity > 0.5
MERGE (n)-[r:IS_SIMILAR_TO]->(m)
SET r.similarity = new_similarity

请注意,您可以在OPTIONAL MATCH下插入一个WHERE语句,如果需要,只匹配相似度低于0.5的IS_SIMILAR_TO关系,这只是最短和最简洁的方法。