请我检查并创建节点以及与预先存在的节点的关系。
我需要检查节点是否预先存在于我的Neo4j数据库中,并创建节点加上与该节点的关系。
谢谢
答案 0 :(得分:2)
以下是使用Cypher 2.0(Neo4j的母语)将现有数据与您动态创建的数据合并的方式:
MERGE ({ name: "Jane" })-[r:KNOWS]->({ name: "John" })
事实上,这些数据都不需要预先存在。它将全部创建,关系和所有。然而,没有太多的检查,如果你犯了一个小错误,这样就很容易创建重复的条目。因此,事先检查事物是一种很好的做法。
以下是您如何使用Cypher检查节点是否已存在:
MATCH (n:SomeNode {some_field: "some_discrete_data"}) RETURN n;
在你的情况下,它可能是这样的:
MATCH (n {id: 1}) RETURN n;
如果某个节点的某个字段包含您需要的数据(在这种情况下我假设它是{id: 1}
,但您当然可能需要其他内容),则会返回该节点。如果没有,它将返回0个节点。
警告:如果您没有描述所需的数据,即{id: 1}
,则会返回数据库中的所有节点,您可能不希望这样。
但是,您无法与一个节点建立关系。您至少需要两个节点才能在它们之间创建关系。所以我们要创建另一个:
CREATE (:OtherNode {id: 2});
要将此新节点与预先存在的节点建立关系,您需要使用MATCH
找到它们,然后创建关系。这是一个例子:
MATCH (node1 {id: 1}), (node2 {id: 2})
CREATE (node1)<-[:LIKES]-(node2);
<-
表示node2将与已经存在的node1具有方向性关系。
然而,您只需一步即可完成此过程;检查节点是否已存在,并同时在新节点和预先存在的节点之间添加新节点加关系!您可以使用UNIQUE
关键字
MATCH (node1 {id: 1})
CREATE UNIQUE (node1)<-[:LIKES]-(node2 {id: 2});
只要node1已经存在,node2及其与node1的关系如果不存在则会被创建。但是,如果node1不存在,则不会发生任何事情。恕我直言,如果你想避免重复,这是一个很好的安全功能。
对于Python-spesific API,您必须检查与您使用的编程语言相关的语言驱动程序的文档。大多数司机以某种形式接受Cypher。这是关于Python的相关部分:http://book.py2neo.org/en/latest/cypher/
答案 1 :(得分:1)
查看用于Cypher支持的py2neo文档,并使用这样的合并查询:
MERGE (user:User {name:"John"}) // get-or-crate
MERGE (friend:User {name:"Jane"}) // create friend
MERGE (user)-[r:KNOWS]->(friend) // create relationship
RETURN user,r,friend
答案 2 :(得分:0)
Cypher的MERGE
就是:http://docs.neo4j.org/chunked/stable/query-merge.html。 http://www.catb.org/esr/faqs/smart-questions.html也可能是一本很好的读物。