Neo4J架构约束验证失败

时间:2018-12-23 02:45:02

标签: neo4j cypher py2neo

总体背景
我目前正在尝试将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文件中。 ..)

非常感谢您,

埃里克

1 个答案:

答案 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