Neo4j:如果节点已经在数据库中,如何避免再次创建节点?
Neo4j: how to avoid node to be created again if it is already in the database?
我对 Cypher 请求和数据库更新有疑问。
我有一个 python 脚本,它可以进行网页抓取并在最后生成一个 csv。我使用此 csv 将数据导入到 neo4j 数据库中。
每天刮5次。因此,每次进行新的抓取时,csv 都会更新,新数据会添加到之前的 csv 中,依此类推。
我在每次抓取后导入数据。
实际上,当我在每次抓取更新数据库后导入数据时,即使它已经在数据库中,我也会再次创建所有节点。
例如,第一个 csv 有 5 行,我将其插入到 Neo4j 中。
接下来,新的抓取给出了 2 行,因此 csv 现在有 7 行。如果我插入数据,我将在数据库中有两次前五行。
如果它已经在数据库中,我希望所有内容都是独一无二的而不是添加。
例如,当我尝试创建节点 ARTICLE 时,我会这样做:
CREATE (a:ARTICLE {id:$id, title:$title, img_url:$img_url, link:$link, sentence:$sentence, published:$published})
我认为 MERGE 而不是 CREATE 应该可以解决问题,但事实并非如此,我也不知道为什么。
我该怎么做?
使用 MERGE
而不是 CREATE
。您可以将它用于节点和关系。
MERGE (charlie { name: 'Charlie Sheen', age: 10 })
创建一个具有属性的节点,其中并非所有属性都与任何现有节点匹配。
MATCH (a:Person {name: "Martin"}),
(b:Person {name: "Marie"})
MERGE (a)-[r:LOVES]->(b)
查找或创建节点之间的关系。
一个 MERGE 子句将 创建 其整个模式,如果它的 任何 部分尚不存在。因此,要使 MERGE
子句合理工作,与其一起使用的模式必须仅指定唯一标识节点(或关系)所需的 最小值 数据。
例如,假设 ARTICLE
节点应该具有独特的 id
属性,那么您应该替换 CREATE
子句:
CREATE (a:ARTICLE {id:$id, title:$title, img_url:$img_url, link:$link, sentence:$sentence, published:$published})
像这样:
MERGE (a:ARTICLE {id:$id})
SET a += {title:$title, img_url:$img_url, link:$link, sentence:$sentence, published:$published}
在上面的示例中,SET
子句将始终覆盖非 id
属性。如果只想在创建节点时设置这些属性,可以在 SET
子句之前使用 ON CREATE。
我对 Cypher 请求和数据库更新有疑问。 我有一个 python 脚本,它可以进行网页抓取并在最后生成一个 csv。我使用此 csv 将数据导入到 neo4j 数据库中。
每天刮5次。因此,每次进行新的抓取时,csv 都会更新,新数据会添加到之前的 csv 中,依此类推。 我在每次抓取后导入数据。 实际上,当我在每次抓取更新数据库后导入数据时,即使它已经在数据库中,我也会再次创建所有节点。
例如,第一个 csv 有 5 行,我将其插入到 Neo4j 中。 接下来,新的抓取给出了 2 行,因此 csv 现在有 7 行。如果我插入数据,我将在数据库中有两次前五行。 如果它已经在数据库中,我希望所有内容都是独一无二的而不是添加。
例如,当我尝试创建节点 ARTICLE 时,我会这样做:
CREATE (a:ARTICLE {id:$id, title:$title, img_url:$img_url, link:$link, sentence:$sentence, published:$published})
我认为 MERGE 而不是 CREATE 应该可以解决问题,但事实并非如此,我也不知道为什么。
我该怎么做?
使用 MERGE
而不是 CREATE
。您可以将它用于节点和关系。
MERGE (charlie { name: 'Charlie Sheen', age: 10 })
创建一个具有属性的节点,其中并非所有属性都与任何现有节点匹配。
MATCH (a:Person {name: "Martin"}),
(b:Person {name: "Marie"})
MERGE (a)-[r:LOVES]->(b)
查找或创建节点之间的关系。
一个 MERGE 子句将 创建 其整个模式,如果它的 任何 部分尚不存在。因此,要使 MERGE
子句合理工作,与其一起使用的模式必须仅指定唯一标识节点(或关系)所需的 最小值 数据。
例如,假设 ARTICLE
节点应该具有独特的 id
属性,那么您应该替换 CREATE
子句:
CREATE (a:ARTICLE {id:$id, title:$title, img_url:$img_url, link:$link, sentence:$sentence, published:$published})
像这样:
MERGE (a:ARTICLE {id:$id})
SET a += {title:$title, img_url:$img_url, link:$link, sentence:$sentence, published:$published}
在上面的示例中,SET
子句将始终覆盖非 id
属性。如果只想在创建节点时设置这些属性,可以在 SET
子句之前使用 ON CREATE。