2016-04-14 8 views
0

KeysとAccテーブルという2つのテーブルをSQL ServerからCSVファイルとしてエクスポートし、以下のコマンドを使用してNeo4Jに正常にインポートしました。条件によっていくつかの関係をクローン

CREATE INDEX ON :Keys(IdKey) 

USING PERIODIC COMMIT 500 
LOAD CSV FROM 'file:///C:/Keys.txt' AS line 
MERGE (k:Keys { IdKey: line[0] }) 
SET k.KeyNam=line[1], k.KeyLib=line[2], k.KeyTyp=line[3], k.KeySubTyp=line[4] 

USING PERIODIC COMMIT 500 
LOAD CSV FROM 'file:///C:/Acc.txt' AS line 
MERGE (callerObject:Keys { IdKey : line[0] }) 
MERGE (calledObject:Keys { IdKey : line[1] }) 
MERGE (callerObject)-[rc:CALLS]->(calledObject) 
SET rc.AccKnd=line[2], rc.Prop=line[3] 

キーはソースコードオブジェクトを表し、Accはそれらの間の関係を表します。 3つの異なるアプリケーションプロジェクトに対して、これらの2つのテーブルを3回インポートしました。 3つのアプリケーションで一意のIdKeyプロパティを維持するために、私はマニュアルから学んだように、複数のフィールドに基づいてインデックスを作成することができないため、IdKeyに5文字の接頭辞を連結してSQL Serverからエクスポートする際にObject for Applicationを識別します。今私の目的は、アプリケーション間の関係を構築することです。例えば:

  • ノード1は、アプリケーション1
  • ノード2のソースコードのオブジェクトは、
  • ノード3は、

既に呼があるアプリケーション2のソースコードの対象であるアプリケーション1の別のソースコードのオブジェクトでありますAcc内のレコードがすでにインポートされているため、ノード1からノード2に作成された関係。 ノード2の名前はノード3の名前と同じです。つまり、Node2とNode3は実際には同じソースコードであると言えるでしょう。したがって、Node1からNode3までの関係を作成する必要があります。それを実現するために、私は以下のコマンドを書いた。しかし、私はそれが正しいことを確かめたい。私はそれがどれくらい実行されるのか分からないからです。

MATCH (caller:Keys)-[rel:CALLS]->(called:Keys),(calledNew:Keys) 
WHERE calledNew.KeyNam = called.KeyNam 
and calledNew.IdKey <> called.IdKey 
CREATE (caller)-[:CALLS]->(calledNew) 

答えて

0

この次のクエリは:Keys(KeyNam)にもcreate an indexあなたを想定し、効率的でなければなりません。

MATCH (caller:Keys)-[rel:CALLS]->(called:Keys) 
WITH caller, COLLECT(called.KeyNam) AS names 
MATCH (calledNew:Keys) 
WHERE calledNew.KeyNam IN names AND NOT (caller)-[:CALLS]->(calledNew) 
CREATE (caller)-[:CALLS]->(calledNew) 

Cypherはプロパティ値間の直接比較を行う際にインデックスを使用しません。したがって、このクエリはcallerのすべてのcalledの名前をnamesコレクションに置き、calledNew.KeyNamとそのコレクションのアイテムの比較を行います。これにより、索引が使用され、ノードと呼ばれる潜在的重複の識別が高速化されます。

このクエリでは、同じノード間で重複するリレーションシップが作成されないように、NOT (caller)-[:CALLS]->(calledNew)のチェックも行います。

関連する問題