NEO4JのCypher:データベースを入力するときだけ1からNの関係を作成する

StackOverflow https://stackoverflow.com//questions/25018248

  •  21-12-2019
  •  | 
  •  

質問

最近、このコードを使用して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);
.

しかし、あなたが推測したかもしれないように、4つの最後の行は私の(:私たちのもの)と私の(:社会)の間のnからn個の関係を作成します。 最初に望んでいたのは、これらの間に1対Nの関係を作成することでした。そのため、(:Dossier)は最大で1つ(:SOCIETE)にリンクできます。

これを達成する方法は?

ありがとう。

役に立ちましたか?

解決

ニコラス、

ここにあなたが行きたい場所にあなたの最後の4行を置き換えるためのちょっとしたCypherです。

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(私を混乱させるが、それが行く方法である)になりません。2番目の部分は、各ドーシエが1のSOCIETEに関連付けられるように関係をトリミングします。あなたは社会的に任務を払わない、あなたはそれらを見つけて取り除くことができます。

恵みと平和、

ジム

他のヒント

すでに社会があるドーシェを除外することができます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top