2013-12-08 12 views
29

Tôi đang thử Neo4j lần đầu tiên. Tôi đang sử dụng phiên bản cộng đồng 2.0-RC1.Thêm mối quan hệ vào các nút hiện có với Cypher

tôi đã tạo ra một số nút:

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'}) 

và bây giờ tôi muốn thêm mối quan hệ giữa các nút. Tuy nhiên, tôi không muốn xóa cơ sở dữ liệu hiện có được tạo bằng tập lệnh ở trên, thêm các câu lệnh và chạy lại. Tôi muốn thêm mối quan hệ vào các nút hiện có. Google đã giúp tôi tìm thấy điều này:

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) 

Làm việc tốt (mặc dù tôi không hiểu tất cả cú pháp). Tuy nhiên, tôi biết rằng điều này tìm thấy bất kỳ nút nào có thuộc tính tên người dùng và bất kỳ nút nào có thuộc tính tên, thay vì sử dụng các nhãn để kiểm tra xem nó có đúng loại nút hay không.

Làm cách nào tôi có thể thực hiện tương tự bằng cách sử dụng nhãn?

Trả lời

49

Trong Neo4j 2.0, bạn có thể tạo ra chỉ số giản đồ cho các nhãn của bạn và các thuộc tính bạn sử dụng cho tra cứu:

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

Để tạo mối quan hệ bạn có thể sử dụng:

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

Các MATCH sẽ sử dụng một chỉ số nếu có thể. Nếu không có chỉ mục, nó sẽ tra cứu tất cả các nút mang nhãn và xem liệu thuộc tính có khớp không.

N.B. cú pháp trên sẽ chỉ hoạt động với Neo4j 2.0.0-RC1 trở lên.

+4

r không phải là lựa chọn tốt nhất của tên biến cho nút thứ hai, thường là r được chỉ định làm tên biến cho mối quan hệ. –

Các vấn đề liên quan