[英]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.