插入新节点的neo4j cypher不会延续现有的关系

时间:2014-05-14 21:24:46

标签: neo4j cypher

我对neo4j cypher查询语言非常陌生。我在节点Client - >之间创建了一个简单的图表。投资组合 - >贸易。以下是密码陈述:

create (c:Client {id:1, name:"Yezdi"}) return c;
create (p:Portfolio {id:1, name:"Yezdi-1", cId:1}) return p;
create (p:Portfolio {id:2, name:"Yezdi-2", cId:1}) return p;
create (p:Portfolio {id:3, name:"Yezdi-3", cId:1}) return p;
create (t:Trade {id:1, qty:100, prc:23.44, pId:1}) return t;
create (t:Trade {id:2, qty:102, prc:23.44, pId:1}) return t;
create (t:Trade {id:3, qty:103, prc:23.44, pId:1}) return t;
create (t:Trade {id:4, qty:104, prc:23.44, pId:2}) return t;
create (t:Trade {id:5, qty:105, prc:23.44, pId:3}) return t;
create (t:Trade {id:6, qty:106, prc:23.44, pId:3}) return t;

match (c:Client),(p:Portfolio) where c.id=p.cId create unique (c)-[:HAS_PORT]->(p);
match (p:Portfolio), (t:Trade) where p.id = t.pId create unique (p)-[:HAS_TRADE]->(t)

当我添加第7个交易节点

create (t:Trade {id:7, qty:107, prc:23.44, pId:2}) return t;

它没有将自己与“Yezdi-2”组合连接起来。 我错过了什么。任何帮助将非常感激。 感谢。

2 个答案:

答案 0 :(得分:1)

由于您使用的是Cypher 2,我建议您查看MERGE而不是CREATE UNIQUE。

无论如何,如果您在上面运行了这两个CREATE UNIQUE语句之后添加了第7个交​​易说明,那么您将不得不重新运行第二个CREATE UNIQUE语句(但是,再次,因为您正在覆盖该中的所有内容)匹配,尝试将CREATE UNIQUE更改为MERGE)。 MERGE肯定只会创建一个节点/关系(如果它还不存在)(即MERGE模式中没有一个可以匹配)。

此外,看起来你正在以一种非常RDBMS的风格创造东西,这是你应该试图摆脱的习惯。可以在创建时指定节点和关系,例如

MERGE (c:Client {name: "Yezdi"})-[:HAS_PORT]->(p:Portfolio {name: "Yezdi-2"};
MERGE (t:Trade {qty:107, prc:23.44})<-[:HAS_TRADE]-(p);
MERGE (t:Trade {qty:100, prc:23.44})<-[:HAS_TRADE]-(p);
...

尽量不要担心RDBMS意义上的“连接”。您可能不需要过多担心单个节点ID,除非出于某种原因在代码中存在外部目的(甚至,我也不会太担心)。

HTH

答案 1 :(得分:0)

我认为你希望将更高的音量分开。

当其他标识符/名称足够时,我认为您不需要id。

  1. 为每个客户,投资组合创建索引/约束,单独交易
  2. 单独创建客户。
  3. 创建投资组合并与客户建立连接
  4. 传递一系列交易,使用FOREACH创建交易并将它们连接到客户和投资组合
  5. 创建客户端

    create (c:Client {name:{name}})
    

    创建投资组合

    MATCH (c:Client {name:{name}})
    FOREACH (p in {portfolios} |
      MERGE (c)-[:HAS_PORT]->(:Portfolio {name:p.name})
    

    创建交易

    FOREACH (t in {trades} |
      MERGE (p:Portfolio {name: t.portfolio})
      MERGE (p)-[:HAS_TRADE]->(:Trade {qty:t.quantity, prc:t.price})
    )
    

    在cypher中使用针对服务器或嵌入式API的参数