Neo4j根据关系数量删除断开连接的图形

时间:2012-06-26 13:59:06

标签: neo4j

我有一张图表,以及Neo4j中的一系列断开连接的图表。

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

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

我在使用数据时使用get或create方法,因此它应该被编入索引。

2 个答案:

答案 0 :(得分: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 documentation

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

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

希望它能给你一些想法。

答案 1 :(得分:-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

希望这有帮助!