使用Cypher为现有节点添加关系

50

我第一次尝试使用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)

这很好用(尽管我不理解所有的语法)。但是,我知道这会找到带有用户名属性和名称属性的任何节点,而不是使用标签来检查它是否具有正确类型的节点。

我该如何使用标签来做同样的事情呢?

2个回答

86

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

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


10
r不是第二个节点的最佳变量名选择,通常r被指定为关系变量的变量名。 - Manuel Hernandez
你如何修改查询以仅在没有关系时创建关系? - Eswar

10

截至2020年4月更新:
新的Cypher语法如下,因为'CREATE INDEX ON'已被弃用...

CREATE INDEX FOR (n:Label) ON (n.property)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接