Neo4j基于关系数删除不连通图

Neo4j基于关系数删除不连通图,neo4j,Neo4j,我有一个图,在Neo4j中有一系列断开连接的图 我想删除仅连接到另一个节点的所有节点 所以我想去掉对,但是保持所有至少有3个节点的图以某种方式连接 我在输入数据时使用了get或create方法,因此应该对所有数据进行索引。这只是我在短时间内提出的一个解决方案。因此,这可能不是最好的,但我希望你能理解这个想法,并根据你的情况加以调整 TraversalDescription td = Traversal.description().depthFirst().evaluator(new Evalua

我有一个图,在Neo4j中有一系列断开连接的图

我想删除仅连接到另一个节点的所有节点

所以我想去掉对,但是保持所有至少有3个节点的图以某种方式连接


我在输入数据时使用了get或create方法,因此应该对所有数据进行索引。

这只是我在短时间内提出的一个解决方案。因此,这可能不是最好的,但我希望你能理解这个想法,并根据你的情况加以调整

TraversalDescription td = Traversal.description().depthFirst().evaluator(new Evaluator() {
        @Override
        public Evaluation evaluate(Path path) {
            if (path.length() == 1) {
                int count = 0;
                Iterator<Relationship> it = path.endNode().getRelationships().iterator();
                while (it.hasNext()) {
                    it.next();
                    count++;
                }
                if (count == 1) {
                    count = 0;
                    it = path.startNode().getRelationships().iterator();
                    while (it.hasNext()) {
                        it.next();
                        count++;
                    }
                    if (count == 1) {
                        return Evaluation.INCLUDE_AND_PRUNE;
                    } else {
                        return Evaluation.EXCLUDE_AND_PRUNE;
                    }
                } else {
                    return Evaluation.EXCLUDE_AND_PRUNE;
                }
            }
            return Evaluation.EXCLUDE_AND_CONTINUE;
        }
    });

    Traverser traverser = td.traverse(**MYNODE**);
TraversalDescription td=Traversal.description().depthFirst().evaluator(新的evaluator()){
@凌驾
公共评估(路径){
if(path.length()==1){
整数计数=0;
迭代器it=path.endNode().getRelationships().Iterator();
while(it.hasNext()){
it.next();
计数++;
}
如果(计数=1){
计数=0;
它=path.startNode().getRelationships().iterator();
while(it.hasNext()){
it.next();
计数++;
}
如果(计数=1){
返回评估。包括_和_修剪;
}否则{
返回Evaluation.EXCLUDE和PRUNE;
}
}否则{
返回Evaluation.EXCLUDE和PRUNE;
}
}
返回Evaluation.EXCLUDE_并_CONTINUE;
}
});
Traverser Traverser=td.traverse(**MYNODE**);
此遍历描述应返回所有路径,其中仅包含2个节点。我还没有测试过它,但它的想法是:它检查路径的开始节点和结束节点(长度1)是否有多个关系。如果是,则它不能是路径的终点,因此不是成对的。否则,它将在稍后由遍历器返回。有关遍历的信息,请查看

使用当前的数据库布局,必须为数据库中的每个节点执行遍历器。这通常是一种不好的方法,因为它会进行太多不必要的迭代。如果你只做一次,这可能是目前的解决方案。如果您想在最终的应用程序中集成此功能,我建议添加一些关系(将每个集群连接到根节点)

可以将根节点(id=0)与数据库中的每个节点之间的关系添加。从根节点开始,使用上面的遍历描述进行遍历(只需将if
(path.length()=1)
更改为if
(path.length()=2)
,并删除startnode上的计数检查)。然后,您将通过一次遍历一对同时获得所有路径。这要快得多。你甚至可以在事后删除这些关系。基本上,您可以按照自己的方式设计关系,您可以在查询或遍历中始终忽略特定的关系。但有时您需要它们,以获得更好的性能和更简单的遍历描述


希望它能给你一些想法。

使用Cypher,你可以通过以下查询完成你的任务:

start a=node(*) 
match a-[r]->b 
where length(a--()) = 1 and length(b--()) = 1 
delete a,r,b
以下是一个链接,您可以在其中看到它的实际应用:


希望这有帮助

您使用的是Spring数据Neo4j吗?是否存在不止一种类型的对象(节点实体)?数据库中大约有多少个节点?知道这些事情会很有帮助。不,不,还有一个很小的数字。大约1000和1500个关系。嗯,我得到了“SyntaxException:非法开始值==>”匹配a-[r]->b,其中长度(a-())=1,长度(b-())=1”“我刚刚添加了一个链接,您可以在其中看到实时运行的查询。它只能在1.8.M04和更高版本上工作。哦。看起来我是早期版本。嗯,好吧,现在查询执行得很好,但它根本不会改变数据。使用return而不是delete返回0行。嗯,问题是每对有两种关系吗?每个节点之间都有一种关系。我把1s改成2s,看起来效果不错,但我不是100%确定。你的链接给了我“错误:非法值”,其中长度(a--())=1,长度(b--())=1。