java – 在neo4j图上做一个DFS
作者:互联网
我有一个具有以下结构的数据库.
属性节点属于该类型
create (A:Property {value:"abc"})
如何进行dfs以便能够打印图中的所有值.顺序A-> B-> E-> F-> C-> G-> H-> ; D-> I->Ĵ
关系r是向下的方向(单向)没有属性.我试过这个link,但看起来很复杂.
是否有更简单的方法在已有的Neo4j数据库上执行简单的dfc
解决方法:
您链接到的链接非常详细,可以涵盖使用Neo4j强大的Traversal API可以执行的所有不同操作.
我想你要做的就是:
TraversalDescription traversalDescription = graphDb.traversalDescription()
.depthFirst()
.relationships(YourRelationShipTypeR, Direction.OUTGOING);
Node a = ... // however you find your node A
try(ResourceIterator<Node> nodes =traversalDescription.traverse(a)
.nodes()
.iterator()){
while(nodes.hasNext()){
Node n = nodes.next();
//or whatever property name you use to get your names for nodes
System.out.print(n.getProperty("id") + "->");
}
}
应该打印A-> B-> E-> F-> C-> G-> H-> D-> I-> J->
您可以通过不在最后一个节点附加箭头来使打印语句更智能,但我会将其留给您
编辑
在我自己尝试代码之后,我得到了深度优先搜索,但迭代器顺序无序.它似乎随意挑选了哪个子节点首先走路.因此,得到的输出类似于A-> D-> J-> I-> C-> H-> G-> B-> F-> E->.
因此,您必须对返回的TraversalDescription路径进行排序,该路径具有排序(Comparator< Path>)方法.
为了匹配您想要的遍历,我按节点属性对路径进行排序,该属性为节点命名,我称之为“id”.这是我更新的遍历代码:
TraversalDescription traversalDescription = graphDb.traversalDescription()
.depthFirst()
.sort(new PathComparatorByName())
.relationships(YourRelationShipTypeR, Direction.OUTGOING);
其中PathComparatorByName是我写的比较器,它根据在名称上按字面排序的路径中遍历的节点对Paths进行排序:
private class PathComparatorByName implements Comparator<Path>{
@Override
public int compare(Path o1, Path o2) {
Iterator<Node> iter1 = o1.nodes().iterator();
Iterator<Node> iter2 = o2.nodes().iterator();
while(iter1.hasNext()){
if(!iter2.hasNext()){
//return shorter path?
return 1;
}
Node n1 = iter1.next();
Node n2 = iter2.next();
int nodeCmp = compareByNodeName(n1, n2);
if(nodeCmp !=0){
return nodeCmp;
}
}
if(iter2.hasNext()){
//return shorter path?
return -1;
}
return 0;
}
private int compareByNodeName(Node node1, Node node2) {
String name1 = (String)node1.getProperty("id");
String name2 = (String)node2.getProperty("id");
return name1.compareTo(name2);
}
}
现在用比较器重新运行它将输出:
A->B->E->F->C->G->H->D->I->J->
标签:java,graph,neo4j,depth-first-search,graph-traversal 来源: https://codeday.me/bug/20190628/1316564.html