neo4j的使用感悟

来源:互联网 发布:淘宝网限制登录申诉 编辑:程序博客网 时间:2024/05/30 20:06

最近接到公司的一个需求:公司经常有批量产品要下线退市,但在退市之前要确保该批产品的物料中专用料库存已经消耗了。所谓专用料指的是除了这批产品,其他产品中没有使用该物料。公司物料数据库中数据是上级节点对应下级节点这种方式一条一条存入的,即1.0.0.1->1.1.0.1  ,1,0.0.1->1.0.0.2 ,1.1.0.1->1.2.0.1,如图方式                         

对于这种关系路径的方式非常适合neo4j来查下关系。

neo4j的两种运行模式(服务器模式和嵌入式模式),果断采用嵌入式模式,速度快10倍以上

嵌入式模式当时想了三种方案,先想的第一种,速度不行改为了第二种,最后采用了第三种:

我做的是批量查询,输入参数是100个1.0物料

方案一:查下批量物料1.0下面所有子节点,获取每个子节点对内路径数m ,该子节点与该批1.0物料路径数n;当m>n,表明该子节点在其他产品中有使用,不是专用料;m=n时,有可能是专用料,继续判断该节点对内的根节点集合是否都在该批1.0物料中,如果都在是专用料,否则不是专用料 。该方案耗时数小时              方案二:查下批量物料1.0下面所有子节点,获取每个子节点对内一级路径数m ,该子节点与该批1.0物料路径数n;当m>n,表明该子节点在其他产品中有使用,不是专用料;m=n时,有可能是专用料,继续判断该节点对内的根节点集合是否都在该批1.0物料中,如果都在是专用料,否则不是专用料 。虽然与一方案相比改动非常小,但耗时缩短到12分钟
方案三:查询1.0物料下所有的子节点,然后去重获得集合list,查询每个子节点对内一级路径的开始节点(即上一节点)集合,判断该集合是否都在list中,如果在是专用料,否则为非专用料。该方案耗时4秒。      三种方案虽然都是用neo4j的嵌入式模式做的,但耗时差距巨大,这再次提醒我在开发之前一定要先缕清思路,彻底了解业务,规划一条合理的代码逻辑。