neo4j - Neo4j - 获取两个节点共享的节点列表作为边缘属性
问题描述
我有两种类型的节点。
- 个人
- 产品
我的主要优势是
(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 的新手,找不到如何去做。因此,如果有人有任何见解,我会很高兴听到
解决方案
要将属性添加到新链接,您可以使用以下内容
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
推荐阅读
- javascript - 测试:模拟点击html元素,用jest和酵素调用函数
- function - 如何仅将任一侧作为参数传递 Haskell
- azure - Azure 存储帐户 - 容器级访问和 ACL
- scala - 如何在 Scala 中为 (key - image name // value - image-file) 创建映射
- jenkins - Jenkins 等待工件下载完成
- javascript - 如何验证我输入的内容未存储在数据库中
- python - 如何将目录中子文件夹中的文件移动到python中的另一个目录?
- debugging - 在 VSCode 中用多种语言编写的调试项目
- swift - SwiftUI 网络图像显示加载和错误的不同视图
- javascript - 创建角色时角色覆盖 discord.js