2013-02-14 35 views
1

我們正在嘗試使用Traversal API檢索給定的一組公司節點,只有提供產品節點列表中包含的所有產品的公司節點。先前使用Cypher的嘗試表現不佳。在這個例子中:Neo4j Traversal API限制?

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)) 

如果我們使用我們找回所有提供任何產品在productNodes列表(所有3家公司在上面的例子中)的公司Evaluator.includeWhereEndNodeIs(productNodes)。如果我們使用Evaluators.includeIfContainsAll(productNodes)評估程序,如果產品節點列表中有多個產品,我們不會收回任何公司節點。

任何建議表示讚賞。

+0

你可以添加原始密碼查詢嗎?這會讓你更容易理解你想達到的目標。 – 2013-02-20 07:58:58

+0

Michael - 這是我們原來的Cypher查詢 - 我們只希望返回的公司提供列表中的所有產品,並且此語法不起作用:START company = node(10719,37496,37417,37464),product = node(37512 ,65094)WHERE公司 - >產品RETURN公司,產品;謝謝 – 2013-02-25 14:09:45

回答

0

我不確定在一個聲明中是否可能,但可以將它們嵌套。 Company2的和公司3將在以下情況下退還:

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()); 
     } 
} 
+0

感謝您的回覆。嘗試一下 - 儘管語法有點困難,但還是沒有運氣。 – 2013-02-15 17:26:20

0

是(公司) - [:PROVIDES_PRODUCT] - >(成品)永遠只有一個水平?在這種情況下,它會被罰款用一個簡單的循環是這樣的:

 
Set<Node> companies = new HashSet<Node>(asList(companyNodes)); 
for (Node product : productNodes) 
{ 
    Set<Node> companiesForThisProduct = new HashSet<Node>(); 
    for (Relationship rel : product.getRelationships(PROVIDES_PRODUCT, INCOMING)) 
     companiesForThisProduct.add(rel.getStartNode()); 
    companies.retainAll(companiesForThisProduct); 
} 

我很快就砍死你用例如數據集,它工作正常。