【发布时间】:2014-05-09 14:31:02
【问题描述】:
我是 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() 方法一样。知道为什么这不起作用吗?
【问题讨论】:
-
您似乎没有对遍历进行任何操作。请参阅这些文档:docs.neo4j.org/chunked/stable/… 调用 traverse() 后,您会返回一个 Traverser 对象,但您不会遍历其结果(节点或关系或路径)。所以目前我没有做任何事情。
-
我实际使用过,但没有复制这段代码。我编辑了我的帖子,感谢您指出这一点。