2013-02-14 7 views
1

мы пытаемся использовать API Traversal для получения для заданного набора узлов компании только узлы компании, которые предоставляют все продукты, которые содержатся в списке узлов продуктов. Предварительные попытки использования Cypher не работали хорошо. В этом примере:Ограничение API-интерфейса Neo4j?

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

Если все 3 компании включены в компании список запроса и продукта А и С находятся в списке продуктов в запросе, мы хотели бы вернуть только компания 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), мы не получим ни одного узла компании, если в списке узлов продукта имеется более одного продукта.

Любые предложения оценены.

+0

Вы можете добавить исходный запрос cypher? Это облегчит понимание того, чего вы хотите достичь. –

+0

Michael - вот оригинальный запрос Cypher, который у нас был - мы хотим только вернуть компании, которые предоставляют все продукты в списке, и этот синтаксис не работал: START company = node (10719,37496,37417,37464), product = node (37512) , 65094) WHERE компания -> продукт RETURN компания, продукт; Спасибо –

ответ

0

Я не уверен, что это возможно в одном заявлении, но вы можете их вложить. Общества2 и 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()); 
     } 
} 
+0

Спасибо за ответ. Попытка этого - не удача, хотя, поскольку синтаксис немного сложнее. –

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

я быстро взломал ваш пример с набором данных и он работает отлично.

 Смежные вопросы

  • Нет связанных вопросов^_^