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;
}
}
我正在尝试使用 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;
}
}