neo4j MATCH语句的优化

zzwlnbp8  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(57)
MATCH (t1:Tel {TB:true})<-[:TelBIZ]-
  (:ACC {TB:true})-[or:REBIZ {movOre:t1.nuTel}]->
  (:ACC {TB:true})-[:TelBIZ]->(t2:Tel {TB:true,nuTel:or.movBene}) 
WHERE t1.nuTel<>t2.nuTel
RETURN t1, t2, COUNT(or) AS Ope, SUM(or.imp) AS Total, 
  10^3 as Precision, max(or.Txt) AS mRB

字符串
我试图让这个查询返回几个值,但我发现查询没有优化,返回了很多数据。请建议我如何优化它。我使用Neo4j v3.5。

a1o7rhls

a1o7rhls1#

我看到的一件事是,你有一个长模式,在这个模式中,你有一个条件,它使用了这个模式中节点的属性。
也就是说,您在t1上匹配并需要{movOre: t1.nutel},当您使用REBIX关系属性在t2: Tel上过滤时,同样的事情也发生了
这意味着必须找到每个t1,以及模式中使用的每个t1.nuTel值。如果您有1000个Tel节点,则您有1000个nuTel属性。基本上,nuTel和movBene的可能性正在爆炸。
您可以重构以将其拆分为多个MATCH语句:

MATCH (t1:Tel {TB:true})
WITH distinct t1.nuTel as t1nuTel
MATCH (t1:Tel {TB:true, nulTel:t1nuTel})<-[:TelBIZ]-(:ACC {TB:true})-[or:REBIZ {movOre: t1nuTel}]->(:ACC {TB:true})->(t2:Tel {TB:true, nuTel: or.movBene})
WHERE t1.nuTel <> t2.nuTel
RETURN t1, t2, count(or) as Ope, sum(or.imp) as Total, 10^3 as Precision, max(or.Txt) as mRB

字符串
对于你的图来说,这可能不是最好的解决方案,而且当or.movBene是模式的一部分时,它仍然存在被用作过滤器的问题,但希望我已经传达了这个想法,你可以从中改进。
此外,nuTel、movBene和TB上的索引将非常快,如果您还没有哈弗的话。

相关问题