Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 在java代码中使用cypher批插入的最佳方法_Neo4j_Cypher - Fatal编程技术网

Neo4j 在java代码中使用cypher批插入的最佳方法

Neo4j 在java代码中使用cypher批插入的最佳方法,neo4j,cypher,Neo4j,Cypher,我不确定这个问题是否已经得到了回答,但现在开始。 我有一个neojdb,已经填充了100k个节点,标记为Person。 我想导入这些人创建的活动,并将其标记为活动。 我有一个大约1000万个活动的csv,我想将其导入Neo4j 下面的代码是我创建Cypher语句所做的,这些语句可以查找与活动关联的用户,创建活动节点,并在用户和活动之间建立关系 处理此问题的方法如下所示 public void addActivityToGraph(List<String> activities) {

我不确定这个问题是否已经得到了回答,但现在开始。 我有一个neojdb,已经填充了100k个节点,标记为Person。 我想导入这些人创建的活动,并将其标记为活动。 我有一个大约1000万个活动的csv,我想将其导入Neo4j

下面的代码是我创建Cypher语句所做的,这些语句可以查找与活动关联的用户,创建活动节点,并在用户和活动之间建立关系

处理此问题的方法如下所示

public void addActivityToGraph(List<String> activities) {

    Map<String, Object> params = new HashMap<>();

    for (String r : activities) {
        String[] rd = r.split(";");
        log.info("Row count: " + (rowCount + 1) + "| " + r);
        log.info("Row count: " + (rowCount + 1)
                + "| Array Length: " + rd.length);

        Map<String, Object> props = new HashMap<>();

        props.put("activityid", Long.parseLong(rd[0]));
        props.put("objecttype", Integer.parseInt(rd[1]));
        props.put("objectid", Integer.parseInt(rd[2]));
        props.put("containertype", Integer.parseInt(rd[3]));
        props.put("containerid", Integer.parseInt(rd[4]));
        props.put("activitytype", Integer.parseInt(rd[5]));
        props.put("creationdate", Long.parseLong(rd[7]));

        params.put("props", props);
        params.put("userid", Integer.parseInt(rd[6]));

        try (Transaction tx = gd.beginTx()) {
           //engine is RestCypherQueryEngine
            engine.query("match (p:Person{userid:{userid}}) create unique (p)-[:created]->(a:Activity{props})", params);

            params.clear();
            tx.success();

        }
    }

}
public void addActivityToGraph(列出活动){
Map params=新的HashMap();
for(字符串r:活动){
字符串[]rd=r.split(“;”);
log.info(“行计数:”+(行计数+1)+“|”+r);
log.info(“行计数:”+(行计数+1)
+“|数组长度:”+rd.Length);
Map props=newhashmap();
props.put(“activityid”,Long.parseLong(rd[0]);
put(“objecttype”,Integer.parseInt(rd[1]);
put(“objectid”,Integer.parseInt(rd[2]);
put(“containertype”,Integer.parseInt(rd[3]);
put(“containerid”,Integer.parseInt(rd[4]);
put(“activitytype”,Integer.parseInt(rd[5]);
props.put(“creationdate”,Long.parseLong(rd[7]);
参数放置(“道具”,道具);
params.put(“userid”,Integer.parseInt(rd[6]);
try(事务tx=gd.beginTx()){
//发动机是静止式发动机
query(“match(p:Person{userid:{userid}})create unique(p)-[:created]->(a:Activity{props})”,params);
参数clear();
成功();
}
}
}
虽然这是可行的,但我确信我没有使用正确的工具组合,因为这个过程需要一整天才能完成。必须有一个更简单的方法。我看到了很多关于Batch Rest API的文档,但我没有看到任何与我在这里看到的案例相关的文档(找到一个已经存在的用户,在用户和一个新活动之间创建关系) 我很感激能在这里得到的一切帮助

谢谢。

进入Neo4j

如果您使用的是2.1 milestone版本,则会出现以下问题

如果您实际上已经构建了CSV,我建议您不要编写一堆java代码来实现它。探索可用的工具,然后从那里开始

使用新的cypher选项,它可能看起来像这样。cypher查询可以在neo4j shell中运行,如果需要,也可以通过java运行

LOAD CSV WITH HEADERS FROM "file:///tmp/myPeople.csv" AS csvLine
MERGE (p:Person { userid: csvLine.userid})
MERGE (a:Activity { someProperty: csvLine.someProperty })
create unique (p)-[:created]->(a)

没有通过连接与rest查询引擎进行的事务。您可以使用批处理,但我认为更明智的做法是使用我的Neo4JShell工具加载您的csv文件

按照概述安装它们,然后使用

import-cypher -i activities.csv MATCH (p:Person{userid:{userid}}) CREATE (p)-[:created]->(a:Activity{activityid:{activityid}, ....})

确保:Person(userid)和:Activity(activityid)具有索引/约束,以便快速匹配和合并。

谢谢。但我运行的是2.0.2版,升级选项对我来说还不可用。还有其他想法吗?我似乎无法理解过多的选项,这些选项似乎不能解决我的用例,但这已经非常接近了。只是版本不对。在我发布的第一个链接中有很多其他的想法和选择。它们都适用于早期版本(包括2)。那就看看吧。有一个从Excel加载CSV的选项,有一个将CSV转换为密码然后以这种方式批量加载的选项。github上有专门的工具可以批量加载csv,查看此链接以了解将csv加载到neo4j中的程序,无需2.1: