2016-03-25 14 views
1

SQLグラフデータベース「エミュレーション」からneo4jにプロジェクトを移行したいと思っています。 source_id、relationship_type、target_idという形式の100000列以上のテーブルがあります。 インポートステートメントは次のとおりです。csvからインポートする際のリレーションシップの変数の使用

LOAD CSV WITH HEADERS FROM 
'file:///usr/local/n4jinput/special_semrelations.csv' AS line 
WITH line 
MATCH (s:SemObject {sem_id: TOINT(line.ool_source_id)}) 
MATCH (t:SemObject {sem_id: TOINT(line.ool_target_id)}) 
CREATE (s)-[line.rlt_relation]->(t) 

問題はcreate文にあります。 [:WHATEVER_IS_IN_THE_CSV]を取得する正しい構文は何ですか?数十種類のリレーションシップタイプがあるので、ここで何らかの変数を使用する必要があります...これがサイファーでは不可能な場合、これを効率的に行うための他の方法はありますか?

+0

おかげで、cybersamは、答えは確かに原理的には同じですが、最初の視点で質問が違うのですが... – cip22

答えて

1

リレーションシップタイプは、Cypherでパラメータ化または動的に指定することはできません。定義されたリレーションシップタイプのセットがある場合、回避策があります。関係タイプは、正しい関係タイプ作成する配列(複数可)を反復処理一致する場合は、配列を移入、関係タイプを比較するCASE文を使用することができますヒントの

LOAD CSV WITH HEADERS FROM 'file:///myfile.csv' AS line 
MATCH (s:SemObject {sem_id: TOINT(line.ool_source_id)}) 
MATCH (t:SemObject {sem_id: TOINT(line.ool_target_id)}) 
WITH s,t, 
    CASE WHEN line.rlt_relation = "MEMBER_OF" THEN [1] ELSE [] END AS member_of, 
    CASE WHEN line.rlt_relation = "BELONGS_TO" THEN [1] ELSE [] END AS belongs_to 
FOREACH (x IN member_of | CREATE (s)-[:MEMBER_OF]->(t)) 
FOREACH (x IN belongs_to | CREATE (s)-[:BELONGS_TO]->(t)) 
+0

返事と回避策をありがとう。私はそれを試みます。 BTW、技術的な理由からCypherで関係タイプを動的に指定できないのですか、ある種のワークフローやモデリングの習慣を強制するのでしょうか? – cip22

+0

私はその理由がクエリプランを生成するプロセスと関係していると考えています。各Cypherクエリは実行計画にコンパイルされ、キャッシュされているため、次にクエリを見てプランを再利用できるようになります。ただし、リレーションシップ・タイプまたはノード・ラベルをパラメータ化すると、問合せプランをキャッシュできません(実行プランはリレーションシップ・タイプ/ノード・ラベルとともに変更できるため)。 –

+0

魅力のように動作します、ありがとう! – cip22

関連する問題