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

Neo4j-获取由两个节点共享的节点列表作为边缘属性,neo4j,cypher,Neo4j,Cypher,我有两种类型的节点 个人 产品 我的主要优势是 (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_produ

我有两种类型的节点

  • 个人
  • 产品
  • 我的主要优势是

    (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)
    

    MATCH(i1:Individual)-[b1:BUYS]->(p:Product)要将属性添加到新链接中,您可以使用以下方法

    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
    

    MATCH(i1:Individual)-[b1:BUYS]->(p:Product)不,但在这个示例中,我知道它是牛奶和苹果。但我们可以说,我正在为5万人和10万件产品做这件事。。。我希望对于匹配的每个模式,它会将产品名称添加到edge propertyOk中的things数组中,我编辑了Cypher查询,假设产品节点有一个“name”属性。一般来说,将冗余数据添加到DB是不好的做法,因为这会使数据模型过于复杂,使编码更加困难。无论何时添加/更新/删除相关数据,都必须确保冗余信息始终保持同步。如果您有并发的数据库请求,那么您必须确保数据同步是以原子方式完成的。非常感谢。是的,我知道我不想添加到许多边缘类型,它已经爆炸。但是在边缘添加元数据是不一样的吗?只是问问……你不需要添加任何新的关系或存储任何额外的数据。例如,如果你想知道谁买的东西和个人“a”买的一样,只需这样做:
    MATCH(i1:individual{name:'a'})-[:buys]>(:Product)你完全正确,但让我们假设我希望我的用户能够在图表中“行走”,我希望他们在边缘上有一些元数据,而不必扩展它,但非常感谢!!不知道你所说的“走”是什么意思。但是我怀疑你可以通过使用一个精心编制的密码查询(不需要任何额外的东西)来做到这一点。