Neo4j嵌入式系统中的逻辑节点删除

Neo4j嵌入式系统中的逻辑节点删除,neo4j,neo4j-embedded,Neo4j,Neo4j Embedded,我在嵌入式Neo4j实例中有以下图表: 我想找到所有不被任何人欢迎的人。这很简单:匹配(n)WHERE NOT()-[:GREETS]->(n)返回n 但是,每当我发现没有打招呼的人时,我希望从数据库中删除这些节点并重复查询,只要它匹配一个或多个节点。换句话说,从图中的图表开始,我想: 运行查询,返回“Alice” 从数据库中删除“Alice” 运行查询,返回“Bob” 从数据库中删除“Bob” 运行查询,该查询不返回匹配项 返回名称“Alice”和“Bob” 此外,我希望在不从数据库中实际删

我在嵌入式Neo4j实例中有以下图表:

我想找到所有不被任何人欢迎的人。这很简单:
匹配(n)WHERE NOT()-[:GREETS]->(n)返回n

但是,每当我发现没有打招呼的人时,我希望从数据库中删除这些节点并重复查询,只要它匹配一个或多个节点。换句话说,从图中的图表开始,我想:

  • 运行查询,返回“Alice”
  • 从数据库中删除“Alice”
  • 运行查询,返回“Bob”
  • 从数据库中删除“Bob”
  • 运行查询,该查询不返回匹配项
  • 返回名称“Alice”和“Bob”
  • 此外,我希望在不从数据库中实际删除任何节点的情况下执行此算法,即,某种“逻辑删除”

    我发现的一个解决方案是不在事务上调用
    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
    的节点集为空