从子节点中的节点给出特定模式

时间:2016-02-15 09:02:18

标签: neo4j

我有节点:(a:charlie)(b:economy)(c:bicycle)。我想创建这种模式:

create (a:charlie)-[x:wants_make]->(b:economy)->[y:by_using]->(c:bicycle)

但它给了我笛卡儿的产品。我已经想过跳过创建节点(b)给予关系[x:want_make]一个属性。但是节点(b)在相同的上下文(经济背景)中有许多其他关系。我想得到上面的模式。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可能需要稍微分解一下您的查询:

MATCH (a:charlie), (b:economy), (c:bicycle)
MERGE (a)-[:wants_make]->(b), (b)->[:by_using]->(c) 

答案 1 :(得分:1)

  1. 如果您的查询如下所示:

    MATCH (a:charlie), (b:economy), (c:bicycle)
    MERGE (a)-[:wants_make]->(b)-[:by_using]->(c);
    

    然后它说这两件事:

    • 每个 wants_make节点和每个 charlie节点之间创建economy关系。
    • 每个 by_using节点和每个 economy节点之间创建bicycle关系。

    左那么,如果charlieeconomybicycle节点的数量是C,E和B,则会产生(C * E * B)合并,这是笛卡尔积的笛卡尔积。

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

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

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

    此查询通过更具体地了解路径中的第一个和最后一个节点来避免笛卡尔积,并且还避免创建已存在的节点和关系。

  3. 而且,更进一步,您可能希望将wants_makeEconomyby_using合并为一个economizes_by_using关系:

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