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

时间:2014-05-01 12:46:47

标签: neo4j cypher

我不确定这是否已经回答了,但是现在这样。 我有一个Neoj DB已经填充了让我们说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();

        }
    }

}

虽然这有效,但我确定我没有使用正确的工具组合,因为这个过程需要一整天才能完成。必须有一个更简单的方法。我看到很多关于Batch Rest API的文档但是我没有看到任何关于我在这里的情况(找到已经存在的用户,在用户和新活动之间创建关系) 我很感激能得到的所有帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

There are many ways to do batch import进入Neo4j。

如果您使用的是2.1里程碑版本,那就是a load CSV option in cypher

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

使用新的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)

答案 1 :(得分:0)

通过网络与rest-query-engine没有任何交易。您可以使用批处理,但我认为使用像我的neo4j-shell-tools这样的东西加载您的csv文件更为明智

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

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

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