Neo4j 使用Cypher向现有节点添加关系

Neo4j 使用Cypher向现有节点添加关系,neo4j,cypher,Neo4j,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'}) 现在我想在节点之间添加关系。但是,我不想清除使用上述脚本创建的现有数据库,添加语句并再次运行它

我第一次试用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'})
现在我想在节点之间添加关系。但是,我不想清除使用上述脚本创建的现有数据库,添加语句并再次运行它。我想向现有节点添加关系。谷歌帮我找到了这个:

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属性的节点,而不是使用标签检查它是否具有正确的节点类型


如何使用标签进行相同操作?

在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)
如果可能,
匹配将使用索引。如果没有索引,它将查找带有标签的所有节点,并查看属性是否匹配


注意:上述语法仅适用于Neo4j 2.0.0-RC1及以上版本。

自2020年4月起更新:
新的Cypher语法如下所示。由于
“在上创建索引”
已被弃用,is


对于第二个节点,r不是变量名的最佳选择,通常r被指定为关系的变量名。如果没有关系,如何修改查询以创建关系?
CREATE INDEX FOR (n:Label) ON (n.property)