1

对于给定的一组公司节点,我们正在尝试使用 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)评估器,如果产品节点列表中有多个产品,我们将不会返回任何公司节点。

任何建议表示赞赏。

4

2 回答 2

0

我不确定它是否可能在一个语句中,但你可以嵌套它们。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());
        }
}
于 2013-02-14T20:00:21.580 回答
0

(company)-[:PROVIDES_PRODUCT]->(product) 总是只有一个级别吗?在这种情况下,使用这样的简单循环就可以了:

Set<Node> 公司 = new HashSet<Node>( asList( companyNodes ) );
对于(节点产品:productNodes)
{
    Set<Node> 公司ForThisProduct = new HashSet<Node>();
    对于(关系 rel:product.getRelationships(PROVIDES_PRODUCT,INCOMING))
        公司ForThisProduct.add(rel.getStartNode());
    公司.retainAll( CompaniesForThisProduct );
}

我很快用你的数据集破解了你的例子,它工作得很好。

于 2013-02-23T16:34:24.080 回答