我在3台计算机的群集上部署了Neo4J,并执行了应该对该群集进行压力测试的代码。
例如,这是删除所有节点的函数:
public void deleteAllNode()
{
try
{
while (amountNode() > 0) {
session.writeTransaction( new TransactionWork<String>()
{
@Override
public String execute( Transaction tx )
{
tx.run( "START nx=node(*) WITH nx LIMIT 1 DETACH DELETE nx");
return "Node Deleted";
}
} );
}
}finally {
}
}
可悲的是,该代码仅执行每秒12个事务。我相信本地单实例计算机上的相同代码快20倍。
这也是AmountNode()的代码:
public int amountNode(){
try
{
StatementResult result = session.run( "MATCH (n) RETURN count(*)");
if(result.hasNext()){
return result.next().get(0).asInt();
}
return 0;
} finally {
}
}
如果有人有更好的方法来计算图中有多少个节点,请随时共享。
这也是我在调用函数之前建立连接的方式:
driver = GraphDatabase.driver( uri1 , AuthTokens.basic(user, password) );
session = driver.session(AccessMode.WRITE);
欢迎任何帮助。谢谢。
答案 0 :(得分:0)
这里的主要问题是,针对每个单个节点删除发出单独的事务以测试图中所有节点的删除效率将非常低。
您应该一次删除所有内容(使用MATCH (n) DETACH DELETE n
),或者使用APOC批量删除操作:
CALL apoc.periodic.iterate('MATCH (n) RETURN n', 'DETACH DELETE n', {})
此外,不建议使用START语法,请避免使用它。
您也根本没有描述您的数据。请记住,DETACH DELETE
不仅会删除该节点,还会删除连接到该节点的所有关系。删除具有成千上万个关系的单个关系可能会与删除成千上万个无关系的节点一样多。另外,在执行这些操作期间必须更新索引,因此通常在幕后进行的工作比您想象的要多。