如何根据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
。我想:
- 如果关系
(node_n)-[r:IS_SIMILAR]-(node_m)
存在 和 [node_n, node_m, new_similarity >= 0.5]
在 similarity_table
中,仅 UPDATE 值从 r.similarity
到 new_similarity
- 如果
(node_n)-[r:IS_SIMILAR]-(node_m)
存在 和 [node_n, node_m, new_similarity < 0.5]
similarity_table
,DELETE r
(因为node_n和node_m不再相似)
- 如果关系
(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
- 如果关系
(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_n
和 node_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
关系,这只是最短和最简洁的方法。
在 neo4j 中,我在数据库中有 IS_SIMILAR
与 属性 similarity
的关系,并且我有一个包含新信息的集合 collect([node_n, node_m, new_similarity]) AS similarity_table
。我想:
- 如果关系
(node_n)-[r:IS_SIMILAR]-(node_m)
存在 和[node_n, node_m, new_similarity >= 0.5]
在similarity_table
中,仅 UPDATE 值从r.similarity
到new_similarity
- 如果
(node_n)-[r:IS_SIMILAR]-(node_m)
存在 和[node_n, node_m, new_similarity < 0.5]
similarity_table
,DELETEr
(因为node_n和node_m不再相似) - 如果关系
(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
- 如果关系
(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_n
和 node_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
关系,这只是最短和最简洁的方法。