我可以在单个查询中使用约束和索引来将csv加载到neo4j吗?

时间:2017-03-29 05:46:23

标签: javascript neo4j

我试图将csv导入neo4j但它工作但速度很慢。 所以我试图用'CONSTRAINT'来加速它。

我的以下作品

     'USING PERIODIC COMMIT \
      LOAD CSV WITH HEADERS FROM {filepath} AS row WITH \
      row limit 1000 \
      MERGE (spot:Spot{id:row.id}) \
      .....there are more line actually ... \
     '

但是当我向查询添加'约束'时它不起作用,比如语法错误。

     'CREATE CONSTRAINT ON (s:Spot) ASSERT s.id is UNIQUE;\
      USING PERIODIC COMMIT \
      LOAD CSV WITH HEADERS FROM {filepath} AS row WITH \
      row limit 1000 \
      MERGE (spot:Spot{id:row.id}) \
      .....there are more line actually ... \
     '

我首先尝试运行约束,然后立即加载csv。但以下说了一些错误。

         var unique_str = ' CREATE CONSTRAINT ON (s:Spot) ASSERT s.id is UNIQUE \
                       CREATE CONSTRAINT ON (c:City) ASSERT c.id is UNIQUE \
                       CREATE CONSTRAINT ON (t:Tag) ASSERT t.id is UNIQUE; '

它出了什么问题?

继续遇到问题,请有人指出我的错误。 我该怎么办? 提前谢谢!

2 个答案:

答案 0 :(得分:2)

模式操作(例如创建约束和创建索引)必须在它们自己的事务中完成,其中该操作是事务中唯一的语句。

您使用的是哪个客户?使用官方Javascript驱动程序,它看起来像这样:

var neo4j = require('neo4j-driver').v1;
var driver = neo4j.driver("bolt://localhost", neo4j.auth.basic("neo4j", "neo4j"));
var session = driver.session();
session.run("CREATE CONSTRAINT ON (s:Spot) ASSERT s.id is UNIQUE;");
session.run("CREATE CONSTRAINT ON (c:City) ASSERT c.id is UNIQUE;");
session.run("CREATE CONSTRAINT ON (t:Tag) ASSERT t.id is UNIQUE;");
session.run("USING PERIODIC COMMIT...");

session.run将为每个语句创建一个隐式事务。

答案 1 :(得分:1)

我认为问题是如果你使用periodic commit,它必须是第一行,这就是你得到语法错误的原因。我要做的是分别创建一个约束,然后像第一次那样运行查询。