首页 > 解决方案 > Neo4j - 获取两个节点共享的节点列表作为边缘属性

问题描述

我有两种类型的节点。

  1. 个人
  2. 产品

我的主要优势是

(i:Individual)-[:BUYS]->(p:Product)

例如,

(BOB)-[BUYS]->(MILK)
(BOB)-[BUYS]->(APPLES)
(SAM)-[BUYS]->(BEER)
(LAURA)-[BUYS]->(MILK)
(LAURA)-[BUYS]->(APPLES)

我想要一个优势

(BOB)-[BUYS_THE_SAME_THINGS_AS {shared_products: [MILK, APPLES]}]-(LAURA)

创建边缘非常简单

MATCH (i1:Individual)-[b1:BUYS]->(p:Product)<-[b2:BUYS]-(i2:Individual) WHERE (i1.name <> i2.name)
MERGE (i1)-[BUYS_THE_SAME_THINGS_AS]-(i2)

我想要的是将数组 [MILK, APPLES] 设置为关系 [BUYS_THE_SAME_THINGS_AS] 的属性

在这个例子中它很简单,因为我知道它是牛奶和苹果。但是让我们说我正在做超过 50K 个人和 100K 产品......我希望对于每个匹配的模式,它会将产品名称附加到边缘属性中的 things 数组

但我是 Cypher 的新手,找不到如何去做。因此,如果有人有任何见解,我会很高兴听到

标签: neo4jcypher

解决方案


要将属性添加到新链接,您可以使用以下内容

MATCH (i1:Individual)-[b1:BUYS]->(p:Product)<-[b2:BUYS]-(i2:Individual)
WHERE (i1.name <> i2.name)
MERGE (i1)-[l:BUYS_THE_SAME_THINGS_AS]-(i2)
ON CREATE set l.things=[p.name]
ON MATCH set l.things=l.things+p.name

推荐阅读