我们正在尝试使用Traversal API针对给定的公司节点集仅检索提供产品节点列表中包含的所有产品的公司节点。先前使用Cypher的尝试效果不佳。在此示例中:

Company 1 provides product A and B
Company 2 provides product A and B and C
Company 3 provides product A and C


如果所有3家公司都包含在公司列表查询中,而产品A和C都包含在查询的产品列表中,我们将只返回公司2和3,因为它们提供了产品A和C。这是我们的查询:

for ( Path position : Traversal.description()
.depthFirst()
.uniqueness(Uniqueness.NODE_GLOBAL)
.relationships(Rels.PROVIDES_PRODUCT, Direction.OUTGOING)
.evaluator((Evaluator) Evaluators.includeWhereEndNodeIs(productNodes))
.traverse(companyNodes))


如果使用Evaluator.includeWhereEndNodeIs(productNodes),则会退回提供productNodes列表中所有产品的所有公司(上例中的所有3家公司)。如果我们使用Evaluators.includeIfContainsAll(productNodes)评估程序,那么如果产品节点列表中有多个产品,则不会获得任何公司节点。

任何建议表示赞赏。

最佳答案

我不确定是否可以在一个语句中进行,但是您可以嵌套它们。在以下情况下,将返回Company2和Company3:

for (final Path position : Traversal
            .description()
            .depthFirst()
            .uniqueness(Uniqueness.RELATIONSHIP_LEVEL)
            .relationships(RelType.PROVIDES_PRODUCT, Direction.OUTGOING)
            .evaluator(
                    (Evaluator) Evaluators.endNodeIs(Evaluation.INCLUDE_AND_CONTINUE, Evaluation.EXCLUDE_AND_CONTINUE,
                            productA)).traverse(company1, company2, company3)) {
        for (final Path position2 : Traversal
                .description()
                .depthFirst()
                .uniqueness(Uniqueness.RELATIONSHIP_LEVEL)
                .relationships(RelType.PROVIDES_PRODUCT, Direction.OUTGOING)
                .evaluator(
                        (Evaluator) Evaluators.endNodeIs(Evaluation.INCLUDE_AND_CONTINUE, Evaluation.EXCLUDE_AND_CONTINUE,
                                productC)).traverse(position.startNode())) {
            System.out.println(position2.startNode());
        }
}

09-27 11:36