我正在尝试使用orientdb大量删除顶点的性能结果的原型。我需要原型试图删除超过10000万。
首先,我在创建我的顶点和边缘时使用轻量级边缘属性为假 Issue with creating edge in OrientDb with Blueprints / Tinkerpop
当我尝试删除时(请参阅下面的代码)
private static OrientGraph graph = new OrientGraph(
"remote:localhost/WorkDBMassDelete2", "admin", "admin");
private static void removeCompleatedWork() {
try {
long startTime = System.currentTimeMillis();
List params = new ArrayList();
String deleteQuery = "delete vertex Work where out('status') contains (work-state = 'Not Started')";
int no = graph.getRawGraph().command(new OCommandSQL(deleteQuery))
.execute(params);
// graph.commit();
long endTime = System.currentTimeMillis();
System.out.println("No of activities removed : " + no
+ " and time taken is : " + (endTime - startTime));
} catch (Exception e) {
e.printStackTrace();
} finally {
graph.shutdown();
}
}
如果我要在100个活动中删除500个活动,结果是好的。但是当我试图删除2500/5000个活动时,没有超过2500个删除的内容需要大约6000个。
A)我也试过创建索引。在属性工作状态上创建索引或在边缘状态上创建索引的最佳实践是什么?我在创建顶点和边缘时尝试了两种方法。但两者都没有提高性能。
((OrientBaseGraph) graph).createKeyIndex("Status", Edge.class);
//or on the vertex
((OrientBaseGraph) graph).createKeyIndex("work-state", Vertex.class);
使用上述查询删除质量/组数据的最佳做法是什么?非常感谢任何帮助。
更新:
我从https://oss.sonatype.org/content/repositories/snapshots/com/orientechnologies/orientdb-community/1.7-SNAPSHOT/下载了orientdb-community-1.7-20140416.230539-144-distribution.tar.gz。
当我尝试使用工作室/程序中的子查询进行删除时,我收到以下错误:com.orientechnologies.orient.core.sql.OCommandSQLParsingException:在位置#0解析命令时出错:Class' FROM不是发现。我修改了我的查询:
delete vertex from (select in('status') from State where work-state = 'Complete')
另外,当我通过程序运行它时,我将maven依赖项更新为1.7-SNAPSHOT库。我的旧查询仍然生成相同的数字,子查询删除甚至在工作室中也出错。如果我遗失任何东西,请告诉我。谢谢!!
答案 0 :(得分:0)
首先,请尝试使用1.7-SNAPSHOT完全相同的代码。它应该更快。
然后在1.7-SNAPSHOT中我们刚刚添加了从子查询中删除顶点的功能。这是因为当你可以从状态顶点删除所有传入的顶点时,为什么要浏览所有的工作"未开始"?
因此,如果您使用1.7-SNAPSHOT更改此查询:
delete vertex Work where out('status') contains (work-state = 'Not Started')
to(假设状态顶点被调用"状态"):
delete vertex from (select in('status') from State where work-state = 'Not Started')