是否可以使用cypher在加入前强制投影?
在下面的例子中,假设电影" m"盯着255名演员,我预计会有大约255分贝的点击率。但是,该计划决定在Projection之前执行NodeHashJoin,导致超过2 * 255 2 db命中。
MATCH (actorA)-->(m:Movie {name:"m"})<--(actorB)
USING JOIN ON m
WITH actorA.id AS aid, actorB.id AS bid
WHERE aid < bid
RETURN aid, bid
答案 0 :(得分:3)
看起来你想要电影中所有演员的交叉产品中的成对演员,然后在id上使用不等式来防止匹配同一对演员。我们可以通过几种方式改进这一方法。
根据您当前的计划,您将两次扩展到电影的演员,一次是演员A,另一次是演员B.我们可以将其更改为仅扩展为actor一次,将它们放入集合(使用模式理解),并通过将集合展开两次,然后执行过滤来获得所需的交叉产品。
此外,我们可以根据neo4j内部id进行过滤,而不是依赖于需要属性访问的属性id进行过滤。
试试这个:
WITH [(actor)-->(:Movie {name:"m"}) | actor] as actors
UNWIND actors as actorA
UNWIND actors as actorB
WITH actorA, actorB
WHERE id(actorA) < id(actorB)
RETURN actorA.id AS aid, actorB.id AS bid
如果你想强迫在你的UNWIND之前投射id,你可以在一开始就这样做,只需使用id属性而不是其余的节点:
WITH [(actor)-->(:Movie {name:"m"}) | actor.id] as actors
UNWIND actors as aid
UNWIND actors as bid
WITH aid, bid
WHERE aid < bid
RETURN aid, bid