Neo4j-获取两个节点共享的节点列表作为边缘属性

时间:2019-04-04 13:34:03

标签: neo4j cypher

我有两种类型的节点。

  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]的属性

在此示例中,这很简单,因为我知道它是牛奶和苹果。但是,让我们说我正在处理超过5万个个人和10万个产品...我希望针对每个匹配的模式,它将产品名称附加到edge属性中的事物数组中

但是我对Cypher还是陌生的,所以找不到解决方法。 因此,如果有人有任何见解,我将很高兴听到

1 个答案:

答案 0 :(得分:0)

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

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