我有一个图表,嗯,Neo4j 中的一系列断开连接的图表。
我想删除仅连接到另一个节点的所有节点。
所以我想摆脱这些对,但保持所有至少有 3 个节点的图以某种方式连接。
我在输入数据时使用了 get 或 create 方法,所以它应该全部被索引。
我有一个图表,嗯,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**);
此遍历描述应返回仅包含 2 个节点的所有路径。我没有测试过它,但想法是:它检查路径(长度为 1)的开始和结束节点是否有多个关系。如果是这样,它就不可能是路径的尽头,因此不是一对。否则它将由遍历器稍后返回。有关遍历的信息,请查看neo4j 文档。
对于您当前的数据库布局,您必须为数据库中的每个节点执行遍历器。这通常是一种不好的做法,因为它做了很多不必要的迭代。如果你只这样做一次,它可能是暂时的解决方案。如果您想将此功能集成到您的最终应用程序中,我建议您添加一些关系(将每个集群连接到根节点)。
您可以添加从根节点 (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
这是一个链接,您可以在其中看到它的实际效果:http ://console.neo4j.org/r/1re6t
希望这可以帮助!