2016-07-27 5 views
-1

初めての方neo4jです。私はMySQLからneo4jにレコードをインポートするスクリプトを書いています。同じタイプのノードを作成するより良い方法を知りたい。neo4j - 同じタイプのノードを作成するより良い方法

CREATE (Like:like_1 { 'node_type:"likes", like_name:"abc" }) 
CREATE (Like:like_2 { 'node_type:"likes", like_name:"def" }) 
CREATE (Like:like_3 { 'node_type:"likes", like_name:"ghi" }) 

と同様の方法で、私はユーザー作成:私は、スニペット、以下を検討し、としてが好きに関連するノードを作成しているこのように、合計6つのノードがどこ、作成された

CREATE (User:user_1 { 'node_type:"user", user_name:"alpha" }) 
CREATE (User:user_2 { 'node_type:"user", user_name:"beta" }) 
CREATE (User:user_3 { 'node_type:"user", user_name:"gamma" }) 

を、 (like_ nおよびuser_ nnは、SQLレコードのid(主キー)です。私は、ノードのラベルが私に知られているように、検索の方が良いと思った(like_の後にidが続く)。

MATCH (l:like_1) RETURN l 

上記のノードの作成方法は改善されていますか?それとも私がノードにプロパティとしてidを入れている、以下の(別の)パターン、行く必要があります。第二apparoachが優れている場合

CREATE (Like:like { 'node_type:"likes", like_name:"abc", like_id:"1" }) 
CREATE (Like:like { 'node_type:"likes", like_name:"def", like_id:"2" }) 
CREATE (Like:like { 'node_type:"likes", like_name:"ghi", like_id:"3" }) 
CREATE (User:user { 'node_type:"user", like_name:"alpha", user_id:"1" }) 
CREATE (User:user { 'node_type:"user", like_name:"beta", user_id:"2" }) 
CREATE (User:user { 'node_type:"user", like_name:"gamma", user_id:"3" }) 

同じシナリオでキャリングを、どのように私は関係がビト​​ウィーンズ作ることができる2 user_1すべてlikesとそれを取得しますか?

答えて

2

私は、Cypher開発者ガイドの一部、または少なくともノードラベルの部分を読み直し、クエリ内の変数を使用する必要があると思います。要するに

は、しかし、構文は(variableName:nodeLabel {<params>})

nodeLabelは、リレーショナルデータベース内の型またはテーブルに相当し、それは、ノードラベルとしてUserに理にかなっているではなく、user_1です。

variableNameはクエリの実行中のみ有効です。後でクエリで使用するために、その要素に要素をバインドします。残りのクエリで変数を使用する予定がない場合は、変数をまったく使用しないでください。

IDのプライマリキーの場合は、ノードのプロパティとして設定し、そのラベル/プロパティの組み合わせにユニークな制約を追加する必要があります(ユニークな制約と同じです)。テーブル内の列)。

Likesについては...私は尋ねる必要がありますか、Likeはノードとして、または関係としてより意味を作っていますか?ユーザーはお互い(そして他のもの)好きですか? Likeがデータモデルにどのように適合していますか?

あなたのデータベースを見て、それを直接neo4jに変換しようとするのではなく、エンティティリレーションシップダイアグラムなどを描くか、参照することができます。 neo4jでは、物理モデルが論理モデルであるため、ダイアグラムから実際のDBへの移行は容易でなければなりません。

たとえば、Likesをユーザー間の関係としてモデル化する方が意味があるとします。あなたはこのようにそれを行うことがあります(上記で

MERGE (user1:User { id:1, name:"alpha" }) 
MERGE (user2:User { id:2, name:"beta" }) 
MERGE (user1)-[:Likes]->(user2) 

私はMERGEの代わりに、私は再びこれを実行する場合、それは重複ノードまたは関係を作成しないように、CREATE使用していますが、最大読むことをお勧めしますMERGEでは便利ですが扱いにくいですが、パターン全体ではなく、断片的な使い方が一般的です。私が作成したノードは:Userラベルを持つノードです。 idはプロパティです(実際には、作成スクリプトを実行する前にUserラベルのidプロパティに制約を作成する必要があります)。 2つのノードが作成された後、それらのノード間の関係が作成されます。

別のアプローチでは、ノードの作成とラベルの作成を一度に行うのではなく、それらを別々にすることです。これは別のテーブルでLikesをトラッキングしている場合にも意味があります。

あなたはこのように、しかし、変数なしで、同様にあなたのノードを作成します。

MERGE (:User { id:1, name:"alpha" }) 
MERGE (:User { id:2, name:"beta" }) 

そして、あなたの別々のクエリでは、好きなものの関係を追加し、あなたがユーザーのIDを持っていると仮定し、ユニークな制約がありますと仮定ユーザのIDに:

MATCH (aUser:User{ id:1}) 
MATCH (bUser:User{ id:2}) 
MERGE (aUser)-[:Likes]->(bUser) 

変数はあなたが助けを参照し、他の場所のクエリですでに定義された要素を使用するクエリの期間中にスコープだけです、覚えておいてください。

+1

詳細な回答ありがとうございます。あなたの質問のために、 'Likes'を' Ingredient'と考えると、ユーザーは原料や多くのものを好き嫌いをするかもしれません。ユーザー間に「好き」のような関係はありません。 –

+0

ああ、それを持って、私の答えは、その悪い仮定でもまだ役立つことを願っています。 – InverseFalcon

+0

はい、ありがとうございます。 –

関連する問題