janusgraph幽灵节点定义
当一个顶点在一个事务中被删除,在另一个事务中同时被修改,两个事务成功地提交到最终一致的存储后端,该顶点被修改的属性或边仍然存在。这被称为幽灵节点。使用唯一性键可以在最终一致的后端上防止幽灵节点,但在大多数情况下,性能代价比较大。一个更可伸缩的方法是暂时允许幽灵节点,并在定期的时间间隔内清除它们。另一种选择是在使用的时候用checkInternalVertexExistence()函数实时检测事务详细配置
原文:https://docs.janusgraph.org/common-questions/#ghost-vertices
解决方式
使用janusgraph自带的OLAP任务清除幽灵节点
ghostRemover=ai_edu_graph.getBackend().buildEdgeScanJob().setJob(new org.janusgraph.graphdb.olap.job.GhostVertexRemover(ai_edu_graph)).execute()
查看结果
返回true
表示删除完成
ghostRemover.isDone()
拓展信息
- 删除语句比较简单,可以看出是创建一个异步任务进行删除。
- 查看返回值
JanusGraphManagement.IndexJobFuture
源码,可以看出返回值类型继承自Future
返回值详细信息为ScanMetrics
。
针对Future
可以使用isDone()
方法查看是否完成;get()
方法等待任务结束获取返回信息类ScanMetrics
,cancel()
方法中断任务;getIntermediateResult()
方法可以返回一个ScanMetrics
查看实时的指标数据。 - 查看
ScanMetrics
源码,可以看出这可以返回任务的一些指标,默认值包含成功数和失败数,同时支持自定义指标。
查看任务成功或失败扫描节点数
ghostRemover.getIntermediateResult().get(org.janusgraph.diskstorage.keycolumnvalue.scan.ScanMetrics.Metric.SUCCESS);
ghostRemover.getIntermediateResult().get(org.janusgraph.diskstorage.keycolumnvalue.scan.ScanMetrics.Metric.FAILURE);
- 查看
GhostVertexRemover
源码
查看GhostVertexRemover
自定义的指标,比如查看删除的关系和节点数量
ghostRemover.getIntermediateResult().getCustom(org.janusgraph.graphdb.olap.job.GhostVertexRemover.REMOVED_VERTEX_COUNT)
ghostRemover.getIntermediateResult().getCustom(org.janusgraph.graphdb.olap.job.GhostVertexRemover.REMOVED_RELATION_COUNT)