Warm tip: This article is reproduced from serverfault.com, please click

cypher-Neo4j:如果节点已经在数据库中,如何避免再次创建节点?

(cypher - Neo4j: how to avoid node to be created again if it is already in the database?)

发布于 2020-12-08 12:31:52

我有一个关于Cypher请求和数据库更新的问题。我有一个Python脚本,可以进行网页抓取并在最后生成一个csv。我使用此csv将数据导入neo4j数据库中。

每天进行5次抓取。因此,每次进行新的抓取操作时,都会更新csv,将新数据添加到以前的csv中,依此类推。我在每次抓取后导入数据。实际上,当我在每次 Scraping 擦之后导入数据以更新数据库时,我都再次创建了所有节点,即使该节点已经在数据库中也是如此。

例如,第一个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应该可以解决问题,但事实并非如此,我也不知道为什么。

我怎样才能做到这一点 ?

Questioner
jos97
Viewed
11
cybersam 2020-12-09 06:32:03

如果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属性。如果只想在创建节点时设置这些属性,则可以子句之前使用ON CREATESET