繁体   English   中英

Neo4j遍历API

[英]Neo4j traversal API

我是Neo4j的新手,但是我花了一些时间阅读文档。 我想我了解基本概念,并且现在对Cypher查询非常有信心。 不过,我在理解Traversal API的工作方式时遇到了问题(嗯,我没有得到预期的结果,所以我想我做错了什么)。

这是我的(非常)简单的模型(使用API​​创建):

  Node sugar = graphDb.createNode(LabelType.RAW_MATERIAL.getLabel());
  sugar.setProperty(PropertyType.NAME.getName(), "Sugar");
  Node caramel = graphDb.createNode(LabelType.RAW_MATERIAL.getLabel(), LabelType.COOKED_MEAL.getLabel());
  caramel.setProperty(PropertyType.NAME.getName(), "Caramel");

  caramel.createRelationshipTo(sugar, FoodRelationshipType.CONTAINS);

我要实现的是获取“ Caramel” :CONTAINS所有节点。 我可以使用密码查询来做到这一点:

MATCH (:CookedMeal {name: 'Caramel'}) - [:CONTAINS] -> (rawMaterials)  return rawMaterials

在Java中,我执行了以下操作,但没有成功(因为它仅返回我传递给“ traverse()”方法的节点):

  TraversalDescription traversalDescription = graphDb.traversalDescription()
        .depthFirst()
        .relationships(FoodRelationshipType.CONTAINS, Direction.INCOMING);

  Traverser traverser = traversalDescription.traverse(
        Iterables.toArray(GlobalGraphOperations.at(graphDb).getAllNodesWithLabel(LabelType.COOKED_MEAL.getLabel()), Node.class)
  );

  for (Path path : traverser) {
      System.out.println(path.endNode());
  }

就像查询不使用遍历relationships()方法一样。 知道为什么这行不通吗?

我找到了解决问题的方法:

必须给TraversalDescription有关从起始节点目标节点的操作信息 例如,如果我得到A - [:REL] -> B和从开始A ,我必须说明的关系的出射方向。

这对我来说似乎不方便用户使用,因为它与过滤器不同,尽管过滤器确实如此。

此外,我需要添加.evaluator(Evaluators.excludeStartPosition())从结果中排除初始节点。

我不知道这种解释是否足够清楚,但这是一个有效的代码:

/**
 * Find components of Caramel : tests that level 1 relationship works
 */
@Test
public void testCaramelContainsSugar() {
    try (Transaction ignored = graphDb.beginTx()) {

        Node n = null;
        TraversalDescription traversalDescription = graphDb.traversalDescription()
                .breadthFirst()
                .relationships(FoodRelationshipType.CONTAINS, Direction.OUTGOING)
                .evaluator(Evaluators.excludeStartPosition());

        Traverser traverser = traversalDescription.traverse(
                getSingleNode(LabelType.COOKED_MEAL, PropertyType.NAME.getName(), "Caramel")
        );

        List<Node> endNodes = new ArrayList<>();
        for (Path path : traverser) {
            endNodes.add(path.endNode());
        }

        Assert.assertTrue(endNodes.contains(getSingleNode(LabelType.RAW_MATERIAL, PropertyType.NAME.getName(), "Sugar")));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM