Neo4j如何创建一个属性集,与List不同,没有重复值

时间:2017-07-05 18:05:44

标签: neo4j cypher

我有一个:用户节点之间的爱好关系。

爱好关系包含List属性{ hobbies:['football','hockey'] }

现在我正在迭代数据流,我希望将业余爱好唯一地合并到这个列表中(就像一个集合)。我尝试使用这样的coalesce:

MERGE  (from)-[rel:hobbies]->(to)
set rel.hobbies= COALESCE(rel.hobbies, []) + 'football';

问题是现在我的属性包含重复项

{ hobbies:['football','hockey','football'] }

我怎样才能避免重复?

2 个答案:

答案 0 :(得分:1)

此Cypher查询无需APOC程序即可运行。

MERGE (from)-[rel:hobbies]->(to)
WITH rel, COALESCE(rel.hobbies, []) + 'football' AS hobbies
UNWIND hobbies as r
WITH rel, collect(distinct r) AS unique
set rel.hobbies = unique

此查询使用UNWIND扩展爱好数组,然后将collect唯一的爱好扩展为名为unique的变量。如果您在Neo4j服务器中没有APOC程序,请使用此查询。

答案 1 :(得分:1)

[增订]

此查询将添加' football'仅在hobbies集合尚不存在时(通过先检查):

MERGE (from)-[rel:hobbies]->(to)
FOREACH(x in CASE WHEN NOT ('football' IN rel.hobbies) THEN [1] END |
  SET rel.hobbies = COALESCE(rel.hobbies, []) + 'football') 

您应该使用parameter来代替硬编码添加的爱好(例如,'足球')。

此外,您应该考虑更改数据模型以使用Hobby个节点来表示不同的爱好,这是一种更加面向图的方法。