Neo4j嵌入式系统中的逻辑节点删除
我在嵌入式Neo4j实例中有以下图表: 我想找到所有不被任何人欢迎的人。这很简单:Neo4j嵌入式系统中的逻辑节点删除,neo4j,neo4j-embedded,Neo4j,Neo4j Embedded,我在嵌入式Neo4j实例中有以下图表: 我想找到所有不被任何人欢迎的人。这很简单:匹配(n)WHERE NOT()-[:GREETS]->(n)返回n 但是,每当我发现没有打招呼的人时,我希望从数据库中删除这些节点并重复查询,只要它匹配一个或多个节点。换句话说,从图中的图表开始,我想: 运行查询,返回“Alice” 从数据库中删除“Alice” 运行查询,返回“Bob” 从数据库中删除“Bob” 运行查询,该查询不返回匹配项 返回名称“Alice”和“Bob” 此外,我希望在不从数据库中实际删
匹配(n)WHERE NOT()-[:GREETS]->(n)返回n
但是,每当我发现没有打招呼的人时,我希望从数据库中删除这些节点并重复查询,只要它匹配一个或多个节点。换句话说,从图中的图表开始,我想:
success()
,这样节点删除就不会提交给db,如下代码所示:
import org.neo4j.graphdb.*;
导入org.neo4j.graphdb.factory.GraphDatabaseFactory;
导入java.io.File;
导入java.util.*;
公共类应用程序
{
静态字符串dbPath=“~/neo4j/data/databases/graph.db”;
私有枚举RelTypes实现RelationshipType{GREETS}
公共静态void main(字符串[]args){
File graphDirectory=新文件(dbPath);
GraphDatabaseService graph=new GraphDatabaseFactory().newEmbeddedDatabase(graphDirectory);
Set nothelleed=newhashset();
try(事务tx=graph.beginTx()){
while(true){
Node notgreednode=getFirstNode(图,“匹配(n)其中不匹配()-[:GREETS]->(n)返回n”);
if(notGreetedNode==null){
打破
}
添加((字符串)notGreetedNode.getProperty(“名称”);
detachDeleteNode(图形,notGreetedNode);
}
//这里我不叫tx.success()
}
System.out.println(“未打招呼的人:+String.join(“,”,nothelleed));
graph.shutdown();
}
私有静态节点getFirstNode(GraphDatabaseService图,字符串cypherQuery){
try(Result r=graph.execute(cypherQuery)){
如果(!r.hasNext()){
返回null;
}
集合节点=r.next().values();
if(nodes.size()==0){
返回null;
}
return(Node)nodes.iterator().next();
}
}
私有静态布尔detachDeleteNode(GraphDatabaseService图,节点节点){
最终字符串查询=String.format(“匹配(n),其中ID(n)=%s分离删除n”,node.getId());
try(结果r=graph.execute(查询)){
返回true;
}
}
}
此代码工作正常,并打印“未打招呼的人:Bob,Alice”
我的问题是:这种方法(即在开放事务中保留一系列db操作)是否有我应该注意的缺点(例如潜在的内存问题)?有没有其他方法可以用来实现这一点
我还考虑在节点上使用布尔属性将它们标记为已删除或未删除。我担心的是,我正在处理的实际应用程序包含数千个节点和各种关系,而实际的查询并不简单,因此我不希望更改它们以适应软删除布尔属性(但如果这是最好的方法,我愿意这样做)
另外,请注意,我并不是简单地寻找不在循环中的节点。相反,基本思想如下。我有一些节点满足某个条件c
;我想(逻辑上)远程控制这些节点;这可能会使新节点满足相同的条件c
,依此类推,直到满足c
的节点集为空