Neo4J 架构约束验证失败

Neo4J Schema Constraint Validation Failed

总体背景
我目前正在尝试将 neo4j 查询写入要在 flask 中使用的函数。
我的目标是让该函数从 csv 文件加载数据,该文件会定期自我更新并根据需要创建新的节点和关系。

我一直在尝试遵循此处显示的函数结构:
https://github.com/nicolewhite/neo4j-flask/blob/master/blog/models.py

我已经分别测试了 neo4j 密码查询,我目前 运行 有两个问题(我将 post 在单独的 post 中解决第二个 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  

我遇到的第一个 运行 问题是加载 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 文件来创建一个新的标题节点时,我 运行 遇到一个约束错误,告诉我这个节点已经存在。

我已尝试遵循此处找到的答案:

我目前在浏览器环境下测试的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

...但它仍然给我一个约束错误。

(作为比较,我尝试了 运行ning 我的关键字密码查询,但它似乎工作正常,没有任何错误)

  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 文件中,用于工作...)

非常感谢,

埃里克

您需要使用独特的属性(或属性)进行MERGE,并且只有在MERGE 之后您才能使用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