在使用cypher将节点链接到Neo4j中的新节点之前,如何检查节点是否已存在

时间:2014-08-14 08:49:49

标签: neo4j cypher relationship nodes

我是Neo4j和cypher的新手,想要帮助解决问题。所有的帮助将不胜感激。

这是我的问题:

我创建了两个节点,一个作为用户,一个作为城市,链接到用户。

图表设置

CREATE (n:User{firstName : "John", lastName : "Doe"});

MATCH (user:User{firstName : "John", lastName : "Doe"})
Return user;

查询:

MATCH (user:User)
WHERE user.firstName = "John"
CREATE (city:City { cityName:"Liverpool", areaCode:"34343" })
CREATE (user)-[:STUDY_IN]->(city);

现在我想创建一个新节点(用户)并将该用户链接到现有节点(城市:利物浦)。

我这样做了:

MATCH (city:City)
WHERE city.cityName = "Liverpool"
CREATE (user:User { firstName : "Kent", lastName : "Clark" })
CREATE (user)-[:STUDY_IN]->(city);

在现实生活中,我需要在创建关系之前检查城市是否存在,如果它不存在,那么我想为该城市创建一个新节点。

您可以在此处查看我的代码: http://console.neo4j.org/?id=utor92

1 个答案:

答案 0 :(得分:2)

使用MERGE命令匹配模式(如果存在)或创建模式(如果不存在)。

CREATE (user:User{firstName: "Kent", lastName: "Clark"})
MERGE (city:City{cityName: "Liverpool"})
CREATE (user)-[:STUDY_IN]->(city)
RETURN user, city

您还可以将ON CREATEON MATCHMERGE一起使用。例如:

MERGE (city:City{cityName: "Manchester"})
ON CREATE SET city.foo = "bar"
ON MATCH SET city.baz = "qux"

在此示例中,如果city不存在,则会创建它,并且属性foo设置为"bar"。如果已存在,则属性baz将设置为"qux"

要更深入地了解MERGE check out the docs