2020-10-14

janusgraph 批量导入数据,日期转换,去除重复节点、重复边

从文件批量导入图数据到 janusgraph,分享一下我的方法。

材料

  1. Janusgraph 版本 0.3.1
  2. 自带的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
        }
    }
}

解释:

  1. 设置日期解析格式
  2. 每列数据间用制表符分割
  3. 对每行的第一列数据(序号从0开始),例如“北京AAA有限公司”,查询图中是否有节点属性’名称’等于它的节点;如果没有,则用g.addV().property()增加节点并设置’名称’属性
  4. 对每行的第三列数据,例如“深圳BBB有限公司”,用类似2.的方法查询图中是否有对应节点;如果没有,则添加节点并设置属性,对于值为浮点类型的属性,不需要显式转换,对于值为日期类型的属性,用format.parse()转换为日期
  5. 查找图中是否有v0指向v1且边标签为第二列数据的边,例如表示“北京AAA有限公司” - “对外投资” -> “深圳BBB有限公司”的边
  6. 如果没有,则用addE().from().to().property()添加边,并设置属性,值的格式转换同3.
  7. 按照需要添加另一个节点,如为“葛某某”添加节点
  8. 按照需要添加另一个边,例如表示“深圳BBB有限公司” - “法定代表人” -> “葛某某”

参考:
https://stackoverflow.com/questions/57317629/gremlin-how-to-convert-a-string-to-a-date

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值