web-dev-qa-db-ja.com

Cypherを使用して既存のノードに関係を追加する

Neo4jを初めて試しています。 2.0-RC1コミュニティエディションを使用しています。

私はいくつかのノードを作成しました:

MERGE (u:User{username:'admin',password:'admin'})
MERGE (r1:Role{name:'ROLE_ADMIN'})
MERGE (r2:Role{name:'ROLE_WEB_USER'})
MERGE (r3:Role{name:'ROLE_REST_USER'})

次に、ノード間に関係を追加します。ただし、I do n'tは、上記のスクリプトで作成された既存のデータベースをクリアし、ステートメントを追加して再度実行したいです。既存のノードに関係を追加したい。 Googleはこれを見つけるのに役立ちました:

START n=node(*), m=node(*)  
where has(n.username) and has(m.name) and n.username = 'admin' 
and m.name = 'ROLE_WEB_USER' 
create (n)-[:HAS_ROLE]->(m)

(私はすべての構文を理解していませんが)うまくいきますただし、ラベルを使用して適切なタイプのノードがあることを確認する代わりに、ユーザー名プロパティを持つノードと名前プロパティを持つノードを検出することを認識しています。

ラベルを使用して同じことができますか?

42
Paul Grenyer

Neo4j 2.0では、ラベルとルックアップに使用するプロパティのスキーマインデックスを作成できます。

CREATE INDEX ON :User(username)
CREATE INDEX ON :Role(name)

関係を作成するには、次を使用します。

MATCH (u:User {username:'admin'}), (r:Role {name:'ROLE_WEB_USER'})
CREATE (u)-[:HAS_ROLE]->(r)

MATCHは、可能であればインデックスを使用します。インデックスがない場合、ラベルを保持するすべてのノードを検索し、プロパティが一致するかどうかを確認します。

N.B.上記の構文は、Neo4j 2.0.0-RC1以降でのみ機能します。

72