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 がクエリの製品リストに含まれている場合、製品 A と C を提供しているため、会社 2 と 3 のみを返す必要があります。クエリは次のとおりです。

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

1 つのステートメントで可能かどうかはわかりませんが、ネストすることはできます。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

(会社)-[:PROVIDES_PRODUCT]->(製品) は常に 1 つのレベルだけですか? その場合、次のような単純なループで問題ありません。

Set<Node> companies = new HashSet<Node>( asList( companyNodes ) );
for ( ノード product : productNodes )
{
    Set<Node> companiesForThisProduct = new HashSet<Node>();
    for ( リレーションシップ rel : product.getRelationships( PROVIDES_PRODUCT, INCOMING ) )
        companiesForThisProduct.add( rel.getStartNode() );
    companies.retainAll( companiesForThisProduct );
}

私はあなたの例をあなたのデータセットですぐにハックしましたが、うまくいきました。

于 2013-02-23T16:34:24.080 に答える