1

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

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

我还没有走得很远,我似乎无法弄清楚如何为节点属性创建评估器;

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

2 回答 2

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));
于 2012-07-27T12:51:10.737 回答
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 个不同的结果。您可以尝试使用控制台上的示例(我已添加“类型”属性)。

要在 Java 中执行该操作,您需要创建一个 ExecutionEngine,提供查询,然后按照Neo4j 手册中的描述迭代结果。

于 2012-07-25T17:04:37.230 回答