janusgraph 批量导入数据,日期转换,去除重复节点、重复边
从文件批量导入图数据到 janusgraph,分享一下我的方法。
材料
- Janusgraph 版本 0.3.1
- 自带的gremlin console,java版
准备数据文件
首先把需要批量导入的数据写入文本文件中,比如叫janus_import
janus_import中的一行数据如下:
北京AAA有限公司 对外投资 深圳BBB有限公司 葛某某 3000000.000000 2019-03-05 0 在业 0.900000 2700000.000000 0 2070-01-01 nan
每行记录一条投资信息,我们需要据此进行格式转换,添加节点、边,并设置节点、边的属性
从文件中导入数据到图
gremlin console的导入代码如下:
format = new java.text.SimpleDateFormat("yyyy-MM-dd") // 1
batchSize = 10000
new File("./janus_import").eachLine{
line, count ->
if (line != null && line.trim().length() > 0) {
p=line.split("\t"); // 2
tv0= g.V().has('名称',p[0]);
v0 = tv0.hasNext() ? tv0.next() : g.addV().property('名称', p[0]).next(); // 3
tv1 = g.V().has('名称',p[2]);
v1 = tv1.hasNext() ? tv1.next() : g.addV().property('名称', p[2]).property('regcap', p[4]).property('founddate', format.parse(p[5])).property('investtimes', p[6]).property('状态', p[7]).next(); // 4
te = g.V(v0).as('x').out(p[1]).as('v').V(v1).as('y').select('v').where(eq('y')) ; // 5
e = te.hasNext() ? te.next() : g.V(v0).as('x').V(v1).as('y').addE(p[1]).from('x').to('y').property("investratio", p[8]).property("investamount", p[9]).property("融资轮次", p[10]).property("raisingdate", format.parse(p[11])).iterate(); // 6
tv2 = g.V().has('名称',p[3]);
v2 = tv2.hasNext() ? tv2.next() : g.addV().property('名称', p[3]).next(); // 7
te = g.V(v1).as('x').out("法定代表人").as('v').V(v2).as('y').select('v').where(eq('y')) ;
e = te.hasNext() ? te.next() : g.V(v1).as('x').V(v2).as('y').addE("法定代表人").from('x').to('y').iterate(); // 8
if (count % batchSize == 0) {
graph.tx().commit()
println count
}
}
}
解释:
- 设置日期解析格式
- 每列数据间用制表符分割
- 对每行的第一列数据(序号从0开始),例如“北京AAA有限公司”,查询图中是否有节点属性’名称’等于它的节点;如果没有,则用g.addV().property()增加节点并设置’名称’属性
- 对每行的第三列数据,例如“深圳BBB有限公司”,用类似2.的方法查询图中是否有对应节点;如果没有,则添加节点并设置属性,对于值为浮点类型的属性,不需要显式转换,对于值为日期类型的属性,用format.parse()转换为日期
- 查找图中是否有v0指向v1且边标签为第二列数据的边,例如表示“北京AAA有限公司” - “对外投资” -> “深圳BBB有限公司”的边
- 如果没有,则用addE().from().to().property()添加边,并设置属性,值的格式转换同3.
- 按照需要添加另一个节点,如为“葛某某”添加节点
- 按照需要添加另一个边,例如表示“深圳BBB有限公司” - “法定代表人” -> “葛某某”
参考:
https://stackoverflow.com/questions/57317629/gremlin-how-to-convert-a-string-to-a-date