我正在尝试创建一个 TraversalDescription ,它将执行以下搜索;
我还没有成功,我似乎无法弄清楚如何为节点属性创建一个Evaluator;
TraversalDescription td = Traversal.description().bredthFirst().evaluator(?...);
答案 0 :(得分:4)
我通过简单地实现Evaluator接口并覆盖 Evaluator.evaluate(Path p)方法来解决这个问题;
public final class MyEvaluator implements Evaluator {
private int peopleCount;
private int maxPeople;
public MyEvaluator(int max) {
maxPeople = max;
peopleCount = 0;
}
public Evaluation evaluate(Path p) {
//prune if we have found the required number already
if(peopleCount >= maxPeople) return Evaluation.EXCLUDE_AND_PRUNE;
//grab the node of interest
Node n = p.endNode();
//include if it is a person
if(n.hasProperty("type") && (n.getProperty("type").equals(NodeTypes.PERSON.name()))) {
peopleCount++;
return Evaluation.INCLUDE_AND_CONTINUE;
}
// otherwise just carry on as normal
return Evaluation.EXCLUDE_AND_CONTINUE;
}
}
然后我的 TraversalDescription 定义最终看起来像:
TraversalDescription td = Traversal.description().breadthFirst().evaluator(new MyEvaluator(peopleRequired));
答案 1 :(得分:2)
即使在Java编码时,我建议从Cypher查询开始遍历,如果你真的想要调整性能或进行一些有趣的操作,只需要下载到TraversalDescriptions。
根据您的描述并假设您具有起始节点的ID,Cypher查询可以是:
start n=node(1) match (n)-[*1..2]-(m) where m.type="Person" return distinct(m) limit 2
在任何关系类型之后,这将找到距离起始节点1到2跳之间的所有节点,但是在节点具有设置为“Person”的类型属性的情况下,最终仅返回2个不同的结果。您可以尝试使用example on console(我已添加“类型”属性)。
要从Java中执行该操作,您需要创建一个ExecutionEngine,提供查询,然后按照Neo4j Manual中的描述迭代结果。