Neo4j 在子句期间从节点指定特定的模式

Neo4j 在子句期间从节点指定特定的模式,neo4j,Neo4j,我有节点:(a:charlie),(b:economy),和(c:bicycle)。我要创建此模式: create (a:charlie)-[x:wants_make]->(b:economy)->[y:by_using]->(c:bicycle) 但它给了我笛卡尔积。我已经想过跳过创建节点(b)给关系[x:want\u make]一个属性。但是节点(b)在同一上下文(经济上下文)中有许多其他关系。我想要得到的是上面的图案 有什么建议吗?您可能需要对您的查询进行一些细分: M

我有节点:
(a:charlie)
(b:economy)
,和
(c:bicycle)
。我要创建此模式:

create (a:charlie)-[x:wants_make]->(b:economy)->[y:by_using]->(c:bicycle)
但它给了我笛卡尔积。我已经想过跳过创建节点
(b)
给关系
[x:want\u make]
一个属性。但是节点
(b)
在同一上下文(经济上下文)中有许多其他关系。我想要得到的是上面的图案


有什么建议吗?

您可能需要对您的查询进行一些细分:

MATCH (a:charlie), (b:economy), (c:bicycle)
MERGE (a)-[:wants_make]->(b), (b)->[:by_using]->(c) 
  • 如果您的查询如下所示:

    MATCH (a:charlie), (b:economy), (c:bicycle)
    MERGE (a)-[:wants_make]->(b)-[:by_using]->(c);
    
    MERGE (a:Person {name: 'Charlie Brown'})
    MERGE (c:Bicycle {id: 123})
    MERGE (a)-[:wants_make]->(b:Economy)
    MERGE (b)-[:by_using]->(c);
    
    然后它说的是这两件事:

    • 在每个
      charlie
      节点和每个
      economy
      节点之间创建
      wants\u-make
      关系
    • 使用每个
      经济
      节点和每个
      自行车
      节点之间的关系创建

    因此,如果
    charlie
    economy
    bicycle
    节点的数量是C、E和B——这将导致(C*E*B)合并,这是笛卡尔积的笛卡尔积

    此外,您的数据模型似乎是错误的。例如,使用
    Person
    标签而不是
    charlie
    标签似乎更合理

  • 更合理的查询可能如下所示:

    MATCH (a:charlie), (b:economy), (c:bicycle)
    MERGE (a)-[:wants_make]->(b)-[:by_using]->(c);
    
    MERGE (a:Person {name: 'Charlie Brown'})
    MERGE (c:Bicycle {id: 123})
    MERGE (a)-[:wants_make]->(b:Economy)
    MERGE (b)-[:by_using]->(c);
    
    此查询通过更具体地描述路径中的第一个和最后一个节点来避免笛卡尔积,并且还避免创建已经存在的节点和关系

  • 而且,更进一步地说,您可能希望通过使用
    想要
    经济性
    组合成一个
    节约关系:

    MERGE (a:Person {name: 'Charlie Brown'})
    MERGE (c:Bicycle {id: 123})
    MERGE (a)-[:economizes_by_using]->(c);
    

  • 我希望通过节点b将节点a与节点c关联起来,因为节点b是一个非常重要的节点,与许多其他节点关联,并带有
    :economy
    标签,不能作为属性。提到的节点是唯一的,因此可能该子句不太具体,;我会尝试通过他们的ID来匹配他们。您的第3点将节点
    a
    c
    排除在
    b:economy
    之外。虽然看起来更符合逻辑,但它跳过了图形方案中的一个重要节点(节点
    b
    )。这就是为什么我不能这么做。