我对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”组合连接起来。 我错过了什么。任何帮助将非常感激。 感谢。
答案 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。
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的参数