Вернуть разные пути - PullRequest
       8

Вернуть разные пути

0 голосов
/ 09 декабря 2018

Я хочу получить уникальные шаблоны из моего графика, но если узлы упорядочены по-разному в одних и тех же путях, neo4j считает эти пути разными.

Это шаблон, который я хочу найти:

(a:Store)-[:SELLS]->(:Product)-[:SIMILAR]-(:Product)<-[:SELLS]-(b:Store)
                         |                     |
                    [:BUNDLED]            [:BUNDLED]
                         |                     |
(a:Store)-[:SELLS]->(:Product)-[:SIMILAR]-(:Product)<-[:SELLS]-(b:Store)

Я пробовал этот запрос:

match (a:Store)-[:SELLS]->(p1:Product)-[:BUNDLED]-(p2:Product)<-[:SELLS]-(a),
      (b:Store)-[:SELLS]->(p3:Product)-[:BUNDLED]-(p4:Product)<-[:SELLS]-(b),
      (p1)-[:SIMILAR]-(p3), (p2)-[:SIMILAR]-(p4)
return distinct apoc.coll.sortNodes(a + collect(distinct b),'name'), p1, p2, p3, p4

Какие выходы 4 пути, когда я хочу только один:

[[JojaMarket, PierreStore], apple, orange, banana, kiwi]
[[JojaMarket, PierreStore], orange, apple, kiwi, banana]
[[JojaMarket, PierreStore], banana, kiwi, apple, orange]
[[JojaMarket, PierreStore], kiwi, banana, orange, apple]

Как я могу эффективно попросить neo4j вернуть уникальные шаблоны?

1 Ответ

0 голосов
/ 09 декабря 2018

Для такого рода проблем симметричных совпадений, возвращающих значения в разных порядках, полезно добавить некоторые ограничения на основе идентификатора узлов, что, естественно, должно исключать некоторые из найденных путей.Это также может быть способом получения определенного порядка между двумя узлами, так что вы можете использовать его вместо сортировки a и b.

Попробуйте это:

MATCH (a:Store)-[:SELLS]->(p1:Product)-[:BUNDLED]-(p2:Product)<-[:SELLS]-(a),
      (b:Store)-[:SELLS]->(p3:Product)-[:BUNDLED]-(p4:Product)<-[:SELLS]-(b),
      (p1)-[:SIMILAR]-(p3), (p2)-[:SIMILAR]-(p4)
      WHERE id(a) < id(b) AND id(p1) < id(p2) 
RETURN DISTINCT [a, b], p1, p2, p3, p4
...