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