返回不同的路径

时间:2018-12-09 06:14:44

标签: neo4j cypher neo4j-apoc

我想从图形中获得唯一的模式,但是如果节点在相同路径中的排序不同,那么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 :(得分:1)

对于这类以不同顺序返回值的对称匹配问题,它有助于基于节点的id添加一些限制,这自然应该排除找到的某些路径。这也是获得两个节点之间已定义顺序的一种方法,因此您可以使用它代替对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