我有一个关于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应该可以解决问题,但事实并非如此,我也不知道为什么。
我怎样才能做到这一点 ?
如果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
。
谢谢,我看到在文章数据框的某些列中有NaN值。我将其替换为“无内容”,并且MERGE现在可以正常工作了。我以为是这样,但是我不明白为什么这是个问题?
我也对文章进行NER,并且在对新的抓取工具进行NER时会创建相同的NER节点。我不明白为什么
您没有显示足够的信息或代码(例如,如何生成要传递给Cypher代码的参数,以及现在的实际CYpher代码是什么样子等)。另外,“ NER”是什么意思?您得到的实际错误消息是什么?等等。