Neo4j的Cypher:仅在填充数据库时创建1对n关系

时间:2014-07-29 14:47:20

标签: neo4j cypher one-to-many

我最近尝试使用以下代码填充neo4j测试数据库:

WITH ["Paul","Graham","Voord","Heisenberg","Earles","Grey","Herzog","Griffith","Rogers","Huxley","Waldorf","Astor","Mellon","Humphrey","Messerschmidt","Carmichael","Buchanan","Dalton","Valentino","Meyerholz","Ellington","Abernathy","Harrington","Monroe","Rutherford","Vanderbilt","Montgomery","Worthington","Fitzwilliam","Covington","Hollingsworth"]
AS names,
["Associates",""]
AS suffixes
FOREACH (r IN range(0,49) | CREATE (:Societe {id:10000+r, name:names[r % size(names)]+" & "+names[(r+3) % size(names)]+" "+suffixes[r % size(suffixes)]}));

FOREACH (r IN range(0,99) | CREATE (:Dossier {id:20000+r, Numero:"0"+(r*4)+100}));

MATCH (s:Societe),(d:Dossier)
WITH s,d
WHERE rand() < 0.1
CREATE (s)-[:CONTAINS]->(d);

但是,正如您可能已经猜到的那样,最后四行在我的(:Dossiers)和我的(:Societes)之间创建了n对n的关系。 我最初想要的是在这些之间建立一对一的关系,这样一个(:档案)最多可以链接到一个(:Societe)。

知道怎么做到这一点吗?

感谢。

2 个答案:

答案 0 :(得分:3)

尼古拉斯,

这里有一点Cypher来替换你最后的4行可能会让你到达目的地。

MATCH (s:Societe)
WITH s
MATCH (d:Dossier)
WHERE NOT (d)<-[:CONTAINS]-() AND RAND() < 0.1
CREATE (s)-[:CONTAINS]->(d);

MATCH (d:Dossier)-[r:CONTAINS]-()
WITH d, collect(r) AS rels1
WITH d, rels1[1..] AS rels2
FOREACH(q IN rels2 | DELETE q)

第一部分减少了互连的数量,但没有做到1对n(这使我感到困惑,但这就是它的方式)。第二部分修剪关系,以便每个档案与1个社会相关联。您可能会有没有分配给社团的档案,但您可以找到并删除这些档案。

恩典与和平,

吉姆

答案 1 :(得分:1)

您可以过滤掉已经拥有社交网站的档案。

MATCH (s:Societe), (d:Dossier)
WITH s,d
WHERE rand() < 0.1 and NOT (s)-[:CONTAINS]->()
CREATE (s)-[:CONTAINS]->(d);