【问题标题】:Create Neo4j database using CSV files使用 CSV 文件创建 Neo4j 数据库
【发布时间】:2014-09-29 00:26:39
【问题描述】:

我有 2 个 CSV 文件,我想将它们转换为 Neo4j 数据库。它们看起来像这样:

第一个文件:

name,enzyme
Aminomonas paucivorans,M1.Apa12260I
Aminomonas paucivorans,M2.Apa12260I
Bacillus cellulosilyticus,M1.BceNI
Bacillus cellulosilyticus,M2.BceNI

second file 

name,motif
Aminomonas paucivorans,GGAGNNNNNGGC
Aminomonas paucivorans,GGAGNNNNNGGC
Bacillus cellulosilyticus,CCCNNNNNCTC

如您所见,共同因素是有机体的Name 和。每个Organism 将有几个Enzymes,每个Enzyme 将有1 个MotifMotifs 可以在酶之间相同。我使用以下语句来创建我的数据库:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file1.csv" AS csvLine
MATCH (o:Organism { name: csvLine.name}),(e:Enzyme { name: csvLine.enzyme})
CREATE (o)-[:has_enzyme]->(e) //or maybe CREATE UNIQUE?

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file2.csv" AS csvLine
MATCH (o:Organism { name: csvLine.name}),(m:Motif { name: csvLine.motif})
CREATE (o)-[:has_motif]->(m) //or maybe CREATE UNIQUE?

这在USING PERIODIC COMMIT 的第一行给了我错误,上面写着Invalid input 'S': expected。如果我摆脱 ti,我得到的下一个错误是 WITH is required between CREATE and LOAD CSV (line 6, column 1) "MATCH (o:Organism { name: csvLine.name}),(m:Motif { name: csvLine.motif})" 。我用谷歌搜索了这个问题,这让我找到了这个 answer 。我尝试了给出的答案(刷新浏览器缓存),但问题仍然存在。我在这里做错了什么?查询是否正确?这个问题还有另一种解决方案吗?任何帮助将不胜感激

【问题讨论】:

  • 你用的是什么版本的 Neo4j?
  • 我使用的是2.1.3版本

标签: csv neo4j


【解决方案1】:

您的查询同时有两个问题:

  1. 您不能仅使用“file1.csv”来引用本地文件,因为 neo4j 需要一个 URL
  2. 您使用MATCH 用于数据可能最初不存在的情况;你需要在那里使用MERGE,这基本上就像你添加的创建唯一评论。

我不知道您的特定错误消息的来源是什么,但按照书面说明,这些查询似乎无法正常工作。这是您重新制定的查询,以便它们可以正常工作(我在我的机器上使用您的 CSV 样本对其进行了测试)

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/home/myuser/tmp/file1.csv" AS csvLine
MERGE (o:Organism { name: coalesce(csvLine.name, "No Name")})
MERGE (e:Enzyme { name: csvLine.enzyme})
MERGE (o)-[:has_enzyme]->(e);

请注意这里有 3 个合并语句(MERGE 基本上是 MATCH + CREATE 如果它不存在),以及我使用了 file: URL 的事实。

第二个查询的公式基本相同:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/home/myuser/tmp/file2.csv" AS csvLine
MERGE (o:Organism { name:  coalesce(csvLine.name, "No Name")})
MERGE (m:Motif { name: csvLine.motif})
MERGE (o)-[:has_motif]->(m);

编辑我在有机体的name 属性中添加了coalesce。如果 CSV 中有 name 的空值,则查询将失败。 Coalesce 保证如果 csvLine.name 为空,那么您将返回“No Name”。

【讨论】:

  • USING PERIODIC COMMIT 仍然显示和错误。我摆脱了它以查看查询是否有效,但它显示错误Cannot merge node using null property value for name
  • 啊,所以该错误消息意味着您的 CSV 中的“名称”值之一为空。将在几秒钟内更新答案....
  • 我搜索了这个问题,似乎创建大量节点通常会出现此错误。我添加了USING PERIODIC COMMIT 并重新运行查询,现在错误更详细了:Cannot merge node using null property value for name (Failure when processing URL 'file:/Users/GAMER/Documents/Neo4j/csvs/name_enzyme.csv' on line 2. No rows seem to have been committed. Note that this information might not be accurate.)
  • 我不确定我是否完全理解它对文件路径的期望。它只需要 URL 吗?我使用了与您在答案中给出的完全相同的格式,但它显示cannot load resource。我的路径看起来像这样file:Users/GAMER/Desktop/cypher/name_enzyme.csv
猜你喜欢
  • 2013-09-19
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2017-11-05
  • 2018-01-27
  • 2019-04-15
相关资源
最近更新 更多