2017-12-21 7 views
0

私は現在、neo4jが新しく、手元にあるタスクについてのcypherクエリを調べています。私はJavaでneo4jボルトドライバを使用しています ここに私が達成しようとしているものです。neo4jグラフで1対多の関係を最も効率的に作成する方法は?

employerId 2:[社員1、社員2、employeeId3、...]基本的には雇用主と従業員との関係を示し

私は(HashMapのに保存されている)は、JavaのArrayListとして利用可能なデータ以下のようなものを持っています今

(これらは雇用者2の従業員です)、私はグラフにこれらの従業員に&雇用者を見つける必要がある(彼らは、またはすでに存在しない可能性があります)と「(X:雇用)を作成 - [採用] - >(y:従業員) "それらの間の関係。

私が考えてもいい方法は、毎回雇用主と従業員を検索し、それぞれに個別のCREATEクエリを実行することです。

match (employer:Employer{name:"John"}), (name:Employee{name:"Snow"}) CREATE (employer)-[pr:EMPLOYES]->(employee) 

しかし、私は同じEmployerノードを何度も検索する必要はないと感じています。今のところ私にとっては時間が重要な基準なので、もっと良い方法を探しています(存在する場合)

neo4jへの初心者としては、雇用者IDの検索を一度行うだけで、その結果を使用して複数のクエリを実行し、毎回Employee IDを検索します。しかし、私はこれを行うための正しいクエリを見つけることができません。さらに、これは適切なアプローチですか?私はJavaからこのクエリを準備する必要があります。だから私は複数回クエリを行うか、単一のクエリを送信する必要がありますか?

答えて

1

このクエリは、@ Ljuのものと似ています。しかし、それはいくつかの改善があります。 EmployerためMERGE

  1. は一度だけ行われる必要があるので、UNWINDの前に来る必要があります。それ以外の場合は、Employeeごとに実行されます。
  2. parametersに雇用者の名前(またはID)と従業員のリスト の名前(またはID)を渡す必要があります。以下の例の では、Cypherコードは、 $employerNameおよび$namesというパラメータを参照しています。
  3. また、2 MERGE句の間にあるWITH句は、すべての識別子を前方に渡すだけであったため、必要ありません。 (ただし、Cypherの構文ではMERGEUNWINDの間にWITH句が必要です)。

問合せ:

MERGE (employer:Employer {name: $employerName}) 
WITH employer 
UNWIND $names AS name 
MERGE (employee:Employee {name: name}) 
MERGE (employer)-[:Employs]->(employee) 
RETURN * 
+0

は完璧に動作し、仕事をしていません。ベンチマークでパフォーマンスにも役立つかどうかを確認します。 (それがそうであるように見える) 回答を受け入れたものとしてマークする。 –

関連する問題