2013-12-08 65 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'}) 

,現在我想添加的節點之間的關係。不過,我不要想清除用上面的腳本創建的現有數據庫,添加語句並再次運行它。我想添加關係到現有的節點。谷歌幫我找到這個:

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指定爲關係的變量名稱。 –

相關問題