2016-03-27 13 views
0

かなり大きいJSONオブジェクトがあるとします。このオブジェクトは、さまざまな方法でネストすることができ、配列を含めることができます。このオブジェクトは私にユーザーと、型の特異オブジェクトと、型の複数の(配列)オブジェクトとの関係を提供します。Cypher Insert Neo4Jのクエリ

私の目標は、これを可能な限り迅速かつ効率的にNeo4jに挿入することです。

これはJSON構造を反復して作成された連結文字列である1つのクエリで行うことができますか? (オブジェクトを解析し、複数のノードとの関係の中に抽象化する)私のために困難なこのプロセスを作っている。また

一般的な問題:私は反復てるアレイの場合 、私は文をMERGE連結するとき、のNeo4jのノードが取得複製され、マージは機能しないようです。

//Person to interests 
_.each(interests, function(itr){ 
    ingestQuery += 'MERGE(centerRep)-[:INTERESTED_IN]->(:Interest{name: "'+itr.interest_name+'", category: "'+itr.interest_category+'"})' 
},this) 

したがって、このステートメントを2回実行すると、利害関係ノードが2回作成され、これは望ましくない動作です。

+0

"* JSON構造を反復して作成された連結文字列であることを1つのクエリで知ることができますか?*" - 何を求めているのかわからない:大きな文字列Neo4jで? JSON形式の文字列を複数のノードに解析する必要がありますか?あなたは輸入業者を築こうとしているのですか?明確にするために質問を編集してください。 –

+0

また、別途質問する必要がある追加の質問(マージに関する)があります。 –

+0

編集されていて、ここで答えが簡単であれば、それは私の問題の一部です(1つのクエリですべてを実行しようとすると複数に分けることにしよう) – rambossa

答えて

1

JSONをパラメータとしてCypherクエリに渡し、UNWINDを使用してJSONの配列を反復処理することができます。グラフに挿入するサイファークエリにパラメータが次のようになりますよう

{ "items": [{ 
"question_id": 24620768, 
"link": "http://stackoverflow.com/questions/24620768/neo4j-cypher-query-get-last-n-elements", 
"title": "Neo4j cypher query: get last N elements", 
"answer_count": 1, 
"score": 1, 
..... 
"creation_date": 1404771217, 
"body_markdown": "I have a graph....How can I do that?", 
"tags": ["neo4j", "cypher"], 
"owner": { 
    "reputation": 815, 
    "user_id": 1212067, 
    .... 
    "link": "http://stackoverflow.com/users/1212067/" 
}, 
"answers": [{ 
    "owner": { 
     "reputation": 488, 
     "user_id": 737080, 
     "display_name": "Chris Leishman", 
     .... 
    }, 
    "answer_id": 24620959, 
    "share_link": "http://stackoverflow.com/a/24620959", 
    .... 
    "body_markdown": "The simplest would be to use an ... some discussion on this here:...", 
    "title": "Neo4j cypher query: get last N elements" 
}] 
} 

は、このJSONオブジェクトを渡す:

例えば

this blog postから取られた)、のは、あなたのJSONは次のようになりましょう

WITH {json} as data 
UNWIND data.items as q 
MERGE (question:Question {id:q.question_id}) ON CREATE 
    SET question.title = q.title, question.share_link = q.share_link, question.favorite_count = q.favorite_count 
MERGE (owner:User {id:q.owner.user_id}) ON CREATE SET owner.display_name = q.owner.display_name 
MERGE (owner)-[:ASKED]->(question) 
FOREACH (tagName IN q.tags | MERGE (tag:Tag {name:tagName}) MERGE (question)-[:TAGGED]->(tag)) 
FOREACH (a IN q.answers | 
MERGE (question)<-[:ANSWERS]-(answer:Answer {id:a.answer_id}) 
MERGE (answerer:User {id:a.owner.user_id}) ON CREATE SET answerer.display_name = a.owner.display_name 
MERGE (answer)<-[:PROVIDED]-(answerer)) 

herehereの例がいくつかあります。

マージ問題についてMERGEはパターン全体を調べ、指定されたパターン全体に基づいて "取得または作成"します。通常、単一のノードプロパティでMERGEを使用して、より大きなパターンの代わりにノードが複製されないようにします。詳細については、this blog postのMERGEセクションを参照してください。

+0

ありがとう – rambossa

関連する問題