Neo4J TraversalDescription定义

时间:2012-07-24 15:13:46

标签: java neo4j graph-traversal

我正在尝试创建一个 TraversalDescription ,它将执行以下搜索;

  • 仅返回具有特定属性的节点(“type”==“PERSON”)
  • 返回一定数量的结果(整个图表很大,我们只对本地图表感兴趣)
  • 可以使用任何关系类型

我还没有成功,我似乎无法弄清楚如何为节点属性创建一个Evaluator;

TraversalDescription td = Traversal.description().bredthFirst().evaluator(?...);

2 个答案:

答案 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中的描述迭代结果。