web-dev-qa-db-ja.com

neo4jでノードとリレーションシップを同時に作成する

私はNeo4jで、7つの異なるタイプのノード、合計で約4〜5000のノード、およびそれらの間の約40000の関係を含む構造でデータベースを構築しようとしています。私が現在使用している暗号コードは、最初に次のコードでノードを作成することです。

Create (node1:type {name:'example1', type:'example2'})

一意のノードを持つその例の約4000。

それから私はそのように述べられた関係を持っています:

Create
(node1)-[:r]-(node51),
(node2)-[:r]-(node5),
(node3)-[:r]-(node2);

そのようなユニークな関係の約40000。

小さいスケールのグラフでは、これはまったく問題になりませんでした。ただし、これを使用すると、実行中のクエリの読み込みが停止することはありません。

このタイプのクエリを機能させる方法について何か提案はありますか?または私は代わりに何をすべきですか?

編集します。私が作成しようとしているのは、Movieグラフの例を作成するのと同じ方法で、リリース、リリースバージョン、機能などを含む、製品の大きなグラフです。

製品には合計で約6つのリリースがあり、各リリースには約20のリリースバージョンがあります。合計で371の機能があり、そのうち371の機能には438の機能バージョンもあります。これまでのリリースバージョン(合計120)には、それぞれ約2〜300の機能バージョンがあります。これらのFeatureversionsは、データベース内のすべてのものの少しに依存しているその機能にマップされます。また、これらの機能を実行するための可能なハードウェア、リリースなどのハードウェアの依存関係も含まれているため、基本的に次のような暗号コードを使用しています。

Create (Product1:Product {name:'ABC', type:'Product'})
Create (Release1:Release {name:'12A', type:'Release'})
Create (Release2:Release {name:'13A, type:'release'})
Create (ReleaseVersion1:ReleaseVersion {name:'12.0.1, type:'ReleaseVersion'})
Create (ReleaseVersion2:ReleaseVersion {name:'12.0.2, type:'ReleaseVersion'})    

そしてそれらの下で私はそれらを使用してそれらを構築しました

Create (Product1)<-[:Is_Version_Of]-(Release1),
(Product1)<-[:Is_Version_Of]-(Release2),
(Release2)<-[:Is_Version_Of]-(ReleaseVersion21),        

機能に至るまで、次のような依存関係も追加しました。

(Feature1)-[:Requires]->(Feature239),
(Feature239)-[:Requires]->(Feature51);       

多くの異なるExcelシートなどからこのすべての情報を見つける必要があったので、1つの大量の暗号クエリにまとめてローカルホストの/ browserで実行できると考えて、この方法でコードを作成しました。一度に4〜5000を超えるクエリを使用しない限り、非常にうまく機能しました。次に、データベース全体を最大で約5〜10秒で作成しましたが、約45000のクエリを同時に実行しようとすると、ほぼ24時間実行され、「クエリを実行しています。 .. "。とにかく時間がかかる時間を改善できるかどうか疑問に思いますが、データベースは最終的に作成されますか?または、パフォーマンスを向上させるために、よりスマートなインデックスやその他のことを実行できますか?ちなみに、私の暗号は今書かれているので、データベース内のすべてが製品に何らかの関係があるため、暗号を分割することはできません。コードを書き直す必要がありますか、それともスムーズな方法はありますか?

12
ErikOstergren

次のように、単一のcreateステートメントで相互リンクされた複数のノードと関係を作成できます。

create (a { name: "foo" })-[:HELLO]->(b {name : "bar"}),
       (c {name: "Baz"})-[:GOODBYE]->(d {name:"Quux"});

つまり、1つのステートメントで各ノードを個別に作成し、次に1つのステートメントで各関係を作成するのではなく、これが1つのアプローチです。

最初に照合してから以下を作成することにより、オブジェクトから複数の関係を作成することもできます。

match (a {name: "foo"}), (d {name:"Quux"}) create (a)-[:BLAH]->(d);

もちろん、複数のmatch句と、そこに複数のcreate句を含めることもできます。

特定のタイプのノードを照合してから、そのタイプのノードから必要なすべての関係を作成しようとする場合があります。あなたはこれが多くの質問をすることになるのに十分な関係を持っています。ノードを照合するために使用しているプロパティにインデックスを付けていることを確認してください。 DBが大きくなるにつれて、新しい関係を作成しようとしているものをすばやく検索できるようにすることが重要になります。

「読み込みを停止」していない、実行中のクエリを指定していません。あなたの質問を詳細で更新し、あなたが試したことを私たちに知らせてください、そして多分それは助けることが可能です。

18
FrobberOfBits

ノードの1つがすでに作成されている場合、簡単なアプローチは次のようになります。

MATCH (n: user {uid: "1"}) CREATE (n) -[r: posted]-> (p: post {pid: "42", title: "Good Night", msg: "Have a Nice and peaceful sleep.", author: n.uid});

ここでは、ユーザーノードがすでに存在し、新しいリレーションと新しい投稿ノードを作成しました。

2
Ashwin

Neo4j 2.1プレリリースマイルストーンを使用できる場合は、新しいLOAD CSVおよびPERIODIC COMMIT機能を使用してみてください。これらは、まさにこの種のユースケース向けに設計されています。

LOAD CSV 重複を避けるためにCSVで値を提供しながら、1つ以上のサイファーパターンでデータの構造を記述することができます。

PERIODIC COMMIT は、大規模なインポートの信頼性を高め、必要なメモリの量を減らすことでパフォーマンスを向上させるのに役立ちます。

0
Ben Butler-Cole

もう1つの興味深いアプローチは、Excelで直接ステートメントを生成することです。 http://blog.bruggen.com/2013/05/reloading-my-beergraph-using-in-graph.htmlを参照してください。例として?view = sidebar 。 1つのトランザクションで多数のCREATEステートメントを実行できるため、これは過度に複雑になることはありません。

0
Peter Neubauer