1

我有一个图表,嗯,Neo4j 中的一系列断开连接的图表。

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

所以我想摆脱这些对,但保持所有至少有 3 个节点的图以某种方式连接。

我在输入数据时使用了 get 或 create 方法,所以它应该全部被索引。

4

2 回答 2

0

这只是我在短时间内想出的一个解决方案。所以它可能不是最好的,但我希望你明白这个想法并可以根据你的情况进行调整。

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**);

此遍历描述应返回仅包含 2 个节点的所有路径。我没有测试过它,但想法是:它检查路径(长度为 1)的开始和结束节点是否有多个关系。如果是这样,它就不可能是路径的尽头,因此不是一对。否则它将由遍历器稍后返回。有关遍历的信息,请查看neo4j 文档

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

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

希望能给你一些想法。

于 2012-06-26T15:13:18.520 回答
-1

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

start a=node(*) 
match a-[r]->b 
where length(a--()) = 1 and length(b--()) = 1 
delete a,r,b

这是一个链接,您可以在其中看到它的实际效果:http ://console.neo4j.org/r/1re6t

希望这可以帮助!

于 2012-06-26T15:19:28.037 回答