0

请我无法检查和创建节点以及与预先存在的节点的关系。

我需要检查我的 Neo4j 数据库中是否预先存在节点并创建与该节点的节点加关系。

谢谢

4

3 回答 3

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/

于 2014-03-31T14:03:36.857 回答
1

查看 py2neo 文档以获取 Cypher 支持,并仅使用如下合并查询:

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
于 2014-03-09T21:39:24.140 回答
0

CypherMERGE就是这样:http ://docs.neo4j.org/chunked/stable/query-merge.html 。http://www.catb.org/esr/faqs/smart-questions.html也可能是一本好书。

于 2014-03-08T13:25:47.363 回答