我不确定这是否已经回答了,但是现在这样。 我有一个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的文档但是我没有看到任何关于我在这里的情况(找到已经存在的用户,在用户和新活动之间创建关系) 我很感激能得到的所有帮助。
感谢。
答案 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)具有索引/约束,以便快速进行匹配和合并。