neo4j中的随机邮购遍历

Random Postorder traversal in neo4j

我正在尝试使用 java API 在 Neo4j 中创建算法。该算法称为 GRAIL (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.169.1656&rep=rep1&type=pdf),它将标签分配给图形,以便稍后回答可达性查询。

该算法采用后序深度优先搜索,但每次都是随机遍历(每次遍历随机访问节点的每个子节点)。 在 neo4j java api 中有一个算法(https://github.com/neo4j/neo4j/blob/7f47df8b5d61b0437e39298cd15e840aa1bcfed8/community/kernel/src/main/java/org/neo4j/graphdb/traversal/PostorderDepthFirstSelector.java)没有随机性,我似乎找不到办法做到这一点。

我的代码有一个遍历描述,我想在其中添加一个自定义订单(BranchOrderingPolicy)以实现前面提到的算法。像这样:

 .order(**postorderDepthFirst()**)

neo4j 中默认没有这样的顺序,但是应该可以写一个。 TraversalBranch#next 给出下一个分支,因此您的实现可以全部或部分随机选择。然而,状态保持会有点棘手,而且我猜想像广度优先排序一样需要内存。 Neo4j 将关系保存在每个节点的链表中,因此如果不首先收集所有关系,就没有简单的方法可以随机选择一个。

我的问题的答案很简单,但经过深思熟虑。我只需要更改路径扩展器(我创建了自己的路径扩展器),returns 遍历的关系作为下一个,并且有一行简单的代码来随机化关系。 代码是:

public class customExpander 实现 PathExpander {

private final RelationshipType relationshipType;
private final Direction direction;
private final Integer times;

public customExpander (RelationshipType relationshipType, Direction direction ,Integer times)
{
    this.relationshipType = relationshipType;
    this.direction = direction;
    this.times=times;
}



@Override
public Iterable<Relationship> expand(Path path, BranchState state)
{
        List<Relationship> results = new ArrayList<Relationship>();
        for ( Relationship r : path.endNode().getRelationships( relationshipType, direction ) )
        {  
           results.add( r ); 
        }
        Collections.shuffle(results);
        }       
    return results;         
    }


@Override
public PathExpander<String> reverse()
{
    return null;
}

}