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
总体背景
我目前正在尝试将 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