2015-06-28 84 views
1

玩过玩具数据集之后,这是我第一次尝试使用与工作项目相关的数据。总之,在我将所有数据都转换成Neo4j后,我的最后一个查询就停滞了。看截图。Neo4j加载CSV导入失速

enter image description here

注:我被将其粘贴到浏览器工具原型我的查询,但我更长期的计划是让所有的命令在一个.cql文件,我可以我的工作站上的脚本,以进行夜间分析。

要添加上下文到我的问题,我正在我的macbook原型。

  • 8GB内存
  • 2.2 GHz的英特尔酷睿i7
  • OSX 10.9.5
  • 2.2.0社区

我处理(行/列)的文件。我没有导入每一列,只是更容易保持我的当前数据集。

  • Ability.csv = 3/1
  • brm.csv =34分之276992
  • cont.sv =一十七分之八万零九十三
  • 电子邮件chain.csv =34分之199143(这是唯一的数据我无法得到)
  • 电子邮件第一last.csv =二十〇分之七万七千八百四十九
  • recs.csv =二十〇分之七万七千九百六十二
  • templates_topics.csv = 29/3
  • templates.csv = 49/4
  • topics.csv = 13/1
  • 厂商= 5/1

的唯一的配置选项,我手动设置Neo4j的均neo4j-wrapper.conf其中I设置wrapper.java.initmemorywrapper.java.maxmemory4096。我在找到类似的问题后做了这个。

我做出了这些更改,因为在浏览器中,我收到了处理我的查询时数据库断开连接的错误消息。

最后,由于我的数据与工作相关,因此无法提供测试数据。但是,我可以链接到我的密码查询。

Constraint and LOAD CSV .cql file

任何帮助和建议将不胜感激。我非常有信心这是用户错误,但我对下一步的工作肯定会走上正轨。

+0

在您最近的加载CSV语句中,您使用'Email:cid'作为属性,而您的约束位于'电子邮件:msgid' –

+0

好,赶快看看结果如何。 – Btibert3

+0

这次,当我尝试从cypher.cql文件的第111行开始执行命令时,浏览器中出现“数据库断开连接”警告。从命令行运行该文件是否会提供任何性能改进? – Btibert3

回答

2

避免急于加载到加载CSV中。它不尊重PERIODIC COMMIT。请参阅Mark Needham的article以获取详细解释。

+0

我曾经参考过这篇文章几次。我的第一个问题(在发布之前)是我没有考虑使用'MERGE'。我以为通过使用MATCH + MERGE可以让自己变得更好,但我相信还有一些地方需要重构。 – Btibert3

+0

您是否尝试过使用脚本进行“分而治之”,您可能会确定哪个部分是违规的部分,并使用EXPLAIN/PROFILE功能更好地理解导致问题的原因。尝试(例如)使用关系来分割节点创建,这样您可以删除有问题的MERGE。 – ErnestoE

2

我将第二分割这一个,进一次创建节点和创建关系(每个):

USING PERIODIC COMMIT 10000 
LOAD CSV WITH HEADERS FROM "file:///Users/btibert/Dropbox/Projects/bentley-search-neo4j/data/templates.csv" AS row 
WITH row 
MATCH (r:Vendor {name:row.vendor}) 
WITH row, r 
MERGE (p:Template {name:row.template_clean}) 
MERGE (v:Version {version:row.template_ver}) 
MERGE (p)-[:FROM_VERSION]->(v) 
MERGE (p)-[:CREATED_BY]->(r); 

正如你可以清楚地看到在计划中渴望操作。

我的意思是,如果你只有几千行这并不重要。但是,如果它走向数十万甚至数百万,那么拉动所有数据需要更多的内存。如果你有每个学生可以使用WITH DISTINCT toInt(row.pidm) as pidm, ....数量减少的合并它运行多行同时 :

+----------------+------------------------------------+------------------------------------------------------------------------------------------------+ 
|  Operator |      Identifiers |                       Other | 
+----------------+------------------------------------+------------------------------------------------------------------------------------------------+ 
| EmptyResult |         |                        | 
| UpdateGraph(0) | anon[270], anon[301], p, r, row, v |                     MergePattern | 
| UpdateGraph(1) |   anon[270], p, r, row, v |                     MergePattern | 
| UpdateGraph(2) |      p, r, row, v | MergeNode; row.template_clean; :Template(name); MergeNode; row.template_ver; :Version(version) | 
|   Eager |        r, row |                        | 
| SchemaIndex |        r, row |                  row.vendor; :Vendor(name) | 
|  LoadCSV |        row |                        | 
+----------------+------------------------------------+------------------------------------------------------------------------------------------------+ 

我可能会改变这种为ON CREATE SET变种对于非关键属性。

LOAD CSV WITH HEADERS FROM "recs.csv" AS row 
WITH row 
MERGE (s:Student {pidm:toInt(row.pidm)}) 
ON CREATE SET s.hash_pidm=toInt(row.hash_pidm), ....; 

这一次我会分成两个语句,每一个关系,否则你可能会得到太多的比赛: (你不需要WITH S IN之间)

LOAD CSV WITH HEADERS FROM "...recs.csv" AS row 
WITH row 
MATCH (s:Student {pidm: toInt(row.pidm)}) 
MATCH (v:Vendor {name: row.vendor}) 
MATCH (a:Ability {name: row.ability}) 
WITH row, s, v, a 
MERGE (s)-[:PURCHASED_FROM]->(v) 
MERGE (s)-[:HAS_ABILITY]->(a); 

将成为:

LOAD CSV WITH HEADERS FROM "...recs.csv" AS row 
MATCH (s:Student {pidm: toInt(row.pidm)}) 
MATCH (v:Vendor {name: row.vendor}) 
MERGE (s)-[:PURCHASED_FROM]->(v); 


LOAD CSV WITH HEADERS FROM "...recs.csv" AS row 
MATCH (s:Student {pidm: toInt(row.pidm)}) 
MATCH (a:Ability {name: row.ability}) 
MERGE (s)-[:HAS_ABILITY]->(a); 

这里我还要对自己创建的联系人信息。 (再次上创建SET) ,做在一个单独的语句中的师生关系:

LOAD CSV WITH HEADERS FROM "....cont.csv" AS row 
MERGE (c:Contact {cid:row.cid}) ON CREATE SET ....; 

LOAD CSV WITH HEADERS FROM "...cont.csv" AS row 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (c:Contact {cid:row.cid}) 
MERGE (s)-[:HAS_CONTACT]->(c); 

我还要拆这一个到两个语句:

LOAD CSV WITH HEADERS FROM "...cont.csv" AS row 
WITH row WHERE toInt(row.seqnum) = 1 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (f:Contact {cid:row.first_cont}) 
MERGE (s)-[:FIRST]->(f); 

LOAD CSV WITH HEADERS FROM "...cont.csv" AS row 
WITH row WHERE toInt(row.seqnum) = 1 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (l:Contact {cid:row.last_cont}) 
MERGE (s)-[:LAST]->(l); 

斯普利特这一个进入E-邮件创建和后来通过MSG-ID将其连接到学生:

LOAD CSV WITH HEADERS FROM "...brm.csv" AS row 
MERGE (e:Email {msgid:row.msgid}) ON CREATE SET ... ; 

LOAD CSV WITH HEADERS FROM "file:///Users/btibert/Dropbox/Projects/bentley-search-neo4j/data/brm.csv" AS row 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (e:Email {msgid:row.msgid}) 
MERGE (s)-[:WAS_SENT]->(e); 

HTH迈克尔