我有一个巨大的(20 * 10 ^ 6个节点)网络,我想返回一个从节点a到节点b的路径,让我们说长度为4.我的问题是我还需要显示这些孩子遍历的节点。 我可以很容易地找到一条路径:
public Path getPath( final Node nodeA, final Node nodeB, int depth )
{
PathFinder<Path> finder = GraphAlgoFactory.allSimplePaths(
Traversal.expanderForAllTypes(Direction.OUTGOING), depth);
Path path = finder.findSinglePath( nodeA, nodeB );
return path;
}
但是,我想拥有每个遍历节点的第一个子节点。 问题#1是无法添加到路径。
for (Node n: path.nodes()){
path.add(n.childrens())
}
在neo4j for java中解决这个问题的最佳方法是什么? 要么: 如何实现path.add()? - 我不明白PathExpander应该如何工作; - 我尝试了以下内容,但我被卡住了:
public void expand_path(Node X){
final TraversalDescription TRAVERSAL = Traversal.description()
.breadthFirst()
.relationships(MyTypes.LOVE)
.evaluator(Evaluators.toDepth(1))
.uniqueness(Uniqueness.RELATIONSHIP_GLOBAL);
for (Node n :TRAVERSAL.traverse(X).nodes()){
//HELP!!!
}
}
提前感谢大家
答案 0 :(得分:3)
将这些子节点添加到路径中是没有意义的。从第二个图中可以看出,路径上的节点与子节点一起形成多个路径而不是单个路径。
我能想到的两件事可能会对你的目标有所帮助,
一种方法是获取路径并迭代路径上的节点,对于每个节点,获取所需类型的关系,然后获取路径上节点的另一端节点(子节点) ,
for ( Node nodeOnPath : path.nodes() )
{
Relationship rel = nodeOnPath.getSingleRelationship(MyTypes.LOVE, Direction.INCOMING)
Node childNode = rel.getOtherNode(nodeOnPath)
// process the childNode
}
通过这种方式,您可以访问路径上的每个节点以及其子节点。
另一种方法是使用遍历框架获取通向末端节点的每条路径,并使用“MyTypes.Love”类型的附加关系扩展每个路径,以使用 ExtendedPath.extend将子节点包含到路径中(路径,爱情关系)。
具体地说,假设您有两个给定节点“a”和“d”,以及“a”和“d”之间的路径,&lt; -b&lt; -c&lt; -d。
您将获得以下路径和扩展路径
a&lt; -b,a&lt; -b&lt; -childOfb
a&lt; -b&lt; -c,a&lt; -b&lt; -c&lt; -childOfC
a&lt; -b&lt; -c&lt; -d,a&lt; -b&lt; -c&lt; -d&lt; -childOfd
实现此目的的示例代码如下,
TraversalDescription td = Traversal.description()
.depthFirst()
.relationships(RelTypes.REL, Direction.INCOMING)
.evaluator(new Evaluator() {
@Override
public Evaluation evaluate(final Path path) {
Node endNode = path.endNode();
if ( endNode.getProperty("name").equals('d') ){
return Evaluation.INCLUDE_AND_PRUNE;
}
else {
return Evaluation.INCLUDE_AND_CONTINUE;
}
}
});
for ( Path path : td.traverse(aNode) ) {
Iterator<Relationship> iter = endNode.getRelationships(RelTypes.LOVE,Direction.INCOMING).iterator();
if ( iter.hasNext() ) {
Path extendedPath = ExtendedPath.extend(path, iter.next());
for ( Node enode : extendedPath.nodes() )
System.out.print(enode.getProperty("name") + "---");
}
}