1

我有源节点和目标节点,我想限制路径中的节点和关系类型。我正在使用Neo4j Java API

考虑以下玩具示例,

我们有三个人节点 A、B 和 C。

源节点: A目标节点: B。它们之间可能存在许多其他类型的路径。我想将路径限制为特定格式,例如-

(person) -[worksAt]-> (company) -[CompetitorOf]-> (company) <-[worksAt]- (person)

这可以通过密码查询很容易地实现,但我想知道有什么方法可以使用 Java API 来实现。

在此处输入图像描述

笔记:

  1. 请不要建议限制路径长度,这并不能解决问题。我想限制路径中的节点和关系类型。
  2. 上面提到的例子是玩具例子。我正在尝试工作的图表更复杂,并且有许多可能的路径无法遍历和验证单个路径。
4

2 回答 2

3

从您的问题中并不清楚您实际上要计算什么。您是否有 A 和 B 并想知道他们的公司是否是竞争对手?你有 C 并且想在他们的朋友中找到谁在竞争公司工作吗?

无论如何,如果您正在使用遍历 API(您正在谈论路径),您可以编写一个自定义PathExpander,它将使用 中的最后一个关系Path确定要遍历的下一种关系类型。

如果您只是手动遍历关系,我并没有真正看到问题:只需Node.getRelationships(RelationshipType, Direction)在每个步骤中使用正确的参数进行调用。

与您在 Cypher 中所做的相反,您无需在路径中声明您正在寻找的模式,您只需计算路径以遵循所需的模式。

于 2016-10-18T12:37:53.570 回答
0

在仔细阅读了Neo4j java 文档并尝试了代码之后,我得到了以下解决方案 -

PathFinder通过使用创建自定义PathExpander来过滤探索的路径PathExpanderBuilder

PathExpanderBuilder pathExpanderBuilder = PathExpanderBuilder.empty();

pathExpanderBuilder.add(RelationshipType.withName("worksat"), Direction.OUTGOING);
pathExpanderBuilder.add(RelationshipType.withName("competitorof"), Direction.BOTH);
pathExpanderBuilder.add(RelationshipType.withName("worksat"), Direction.INCOMING);

PathExpander<Object> pathExpander pathExpander = pathExpanderBuilder.build();

创建自定义PathExpander后,您可以使用它来创建适当PathFinder的过滤器遍历PathFinder

PathFinder<Path> allPathFinder = GraphAlgoFactory.allSimplePaths(this.pathExpander, 4);


Iterable<Path> allPaths = allPathFinder.findAllPaths(sourceNode, targetNode);

在我们的示例sourceNode中,节点“A”targetNode是节点“B”。

于 2016-10-21T06:08:29.350 回答