gpt4 book ai didi

java - Neo4j遍历API

转载 作者:行者123 更新时间:2023-12-01 13:00:30 28 4
gpt4 key购买 nike

我是 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 开始,我必须为关系指定一个 OUTGOING 方向.

这对我来说似乎不太用户友好,因为它不像过滤器,我认为它是。

此外,我需要添加 .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")));
}
}

关于java - Neo4j遍历API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23549399/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com