簡體   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