2013-02-14 83 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); 
} 

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