我有一张图表,以及Neo4j中的一系列断开连接的图表。
我想删除仅连接到另一个节点的所有节点。
所以我想摆脱这些对,但保留所有至少有3个节点以某种方式连接的图形。
我在使用数据时使用get或create方法,因此它应该被编入索引。
答案 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
希望这有帮助!