总体背景
我目前正在尝试将neo4j查询写入烧瓶中要使用的函数中。
我的目标是让该功能从csv文件加载数据,该文件会定期进行自我更新并根据需要创建新的节点和关系。
我一直在尝试遵循此处显示的功能结构:
https://github.com/nicolewhite/neo4j-flask/blob/master/blog/models.py
我已经分别测试了neo4j密码查询,并且目前遇到了两个问题(我将在另一个单独的帖子中发布第二个py2neo问题)。
title_id,title
T1,Article Title 1
T2,Article Title 2
我一直在通过手动添加以下行来更改csv文件:
title_id,title
T1,Article Title 1
T2,Article Title 2
T3,TEST
我的关键字csv文件如下所示:
title_id,keyword_id,keyword
T1,K1,aaa
T1,K2,bbb
T1,K3,ccc
T1,K4,ddd
T2,K1,aaa
T2,K5,eee
T2,K6,fff
T2,K4,ddd
同样,我一直在添加新的关键字来进行测试,如下所示:
title_id,keyword_id,keyword
T1,K1,aaa
T1,K2,bbb
T1,K3,ccc
T1,K4,ddd
T2,K1,aaa
T2,K5,eee
T2,K6,fff
T2,K4,ddd
T2,K7,TEST
我的约束如下:
CREATE CONSTRAINT ON (a_title:Title) ASSERT a_title.t_id IS UNIQUE
CREATE CONSTRAINT ON (keyword:Keyword) ASSERT keyword.k_id IS UNIQUE
我遇到的第一个问题是LOAD CSV问题。
我的py2neo代码如下:
def create_titles(self):
#
query = '''
'LOAD CSV WITH HEADERS FROM "file:///1209test_titles.csv" AS csvLine1 WITH csvLine1 ' \
'WHERE csvLine1.title_id IS NOT NULL MERGE (a_title:Title{t_id:csvLine1.title_id,Title:csvLine1.title})'
'''
return graph.run(query)
但是,当我尝试通过将新数据追加到csv文件中来创建新的标题节点时,遇到了一个约束错误,告诉我该节点已经存在。
我试图遵循此处找到的答案:
Neo4j Load CSV only when unique
我正在浏览器环境中测试的当前LOAD CSV代码如下:
LOAD CSV WITH HEADERS FROM "file:///1209test_titles.csv" AS csvLine1
WITH csvLine1
WHERE csvLine1.title_id IS NOT NULL
MERGE (a_title:Title)
ON MATCH SET a_title.t_id = csvLine1.title_id
ON MATCH SET a_title.Title = csvLine1.title
...但是它仍然给我一个约束错误。
(作为比较,我尝试运行我的关键字密码查询,但似乎工作正常,没有任何错误)
query2 = 'LOAD CSV WITH HEADERS FROM
"file:///1209test_titleid_kwid_kw.csv" AS csvLine3
WITH csvLine3 WHERE csvLine3.title_id IS NOT NULL MERGE(keyword:Keyword{k_id:csvLine3.keyword_id,Keyword:csvLine3.keyword}) WITH csvLine3, keyword MATCH(title:Title{t_id:csvLine3.title_id}) MERGE(title)-[r1:HAS_KEYWORDS]->(keyword)'
graph.run(query2)
我不太确定自己在做错什么,我的关键字节点创建和标题节点创建之间有什么区别……(检查我的文件后,将信息附加到用于工作的标题csv文件中。 ..)
非常感谢您,
埃里克
答案 0 :(得分:0)
您需要使用一个或多个唯一属性进行合并,并且只有在合并之后才能使用SET的一种变体。
您引用的这种方法无效:
LOAD CSV WITH HEADERS FROM "file:///1209test_titles.csv" AS csvLine1
WITH csvLine1
WHERE csvLine1.title_id IS NOT NULL
MERGE (a_title:Title)
ON MATCH SET a_title.t_id = csvLine1.title_id
ON MATCH SET a_title.Title = csvLine1.title
此处的MERGE将使其匹配所有与模式匹配的内容,因此它将与数据库中的所有:Title节点匹配,然后对所有这些属性进行设置(然后在CSV中每行重复相同的过程)。
您需要此:
LOAD CSV WITH HEADERS FROM "file:///1209test_titles.csv" AS csvLine1
WITH csvLine1
WHERE csvLine1.title_id IS NOT NULL
MERGE (a_title:Title {t_id:csvLine1.title_id})
ON MATCH SET a_title.Title = csvLine1.title // or just SET if you want to set it in all cases