2013-12-08 5 views
29

Я впервые опробовал Neo4j. Я использую сообщество 2.0-RC1.Добавление отношения к существующим узлам с Cypher

Я создал некоторые узлы:

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 не хотите очистить существующую базу данных, созданную с помощью приведенного выше скрипта, добавить инструкции и запустить ее снова. Я хочу добавить отношения к существующим узлам. 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) 

Это работает нормально (хотя я не понимаю весь синтаксис). Тем не менее, я знаю, что это находит любой узел с именем username и любым узлом с свойством name вместо использования меток, чтобы проверить, что он имеет нужный тип узла.

Как я могу использовать эти же метки?

ответ

49

В 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 и выше.

+4

r не лучший выбор имени переменной для второго узла, часто r обозначается как имя переменной для отношения. –

Смежные вопросы