Neo4j 3.4.4-如果使用LIST

时间:2018-07-16 14:37:18

标签: performance neo4j

在处理方面两个相同的查询。多次运行,以避免缓存在时间上失真:

MATCH (p:Pathway {name: {PNAME}}), (t:target {symbol: {TNAME}}) MERGE (p)-[:INVOLVES]->(t)

上面每秒运行11,100条命令

UNWIND {LIST} AS i MATCH (p:Pathway  {name: i.PNAME}), (t:target {symbol: i.TNAME}) MERGE (p)-[:INVOLVES]->(t)

上面在同一数据集上每秒运行547个命令。

Windows 10 Pro,64GB Ram,SSD,Python 3.7

上面的语句中的两个变量都有唯一的约束,并且两个索引都为ON。

在其他情况下,LIST语句的速度大大加快,因此我喜欢将其用于批量操作。我在Neo4j 3.4上进行了测试,今天在3.4.4,Python 3.6和3.7上进行了测试。使用最新的neo4j驱动程序。结果相同。我的猜测是查询计划未使用索引。 Pathway中约有40,000个节点,目标中有约25,000个节点。

有什么建议吗?预先感谢。

使用列表时的查询计划。对于此配置文件,列表包含一个记录。

建议:计划优化程序可以计算列表中的记录数,以确定是要扫描所有记录还是单独使用唯一索引。也许设置一个阈值,以使用唯一索引是否需要少于10%的行。对于Neo4j开发人员而言只是一个想法。同时,我放弃使用LIST版本。

enter image description here

1 个答案:

答案 0 :(得分:0)

UNWIND {list}是杀死您的原因。您正在将查询的动态性从一个完全更改为另一个。

第一个查询是一个简单的2节点查找,第二个查询是创建一堆行,然后进行每行2节点匹配。

在第一个示例中,对于Cypher Planner而言,显然可以使用索引进行匹配。在稍后的版本中,计划者不确定是否最好的进行方式。针对每一行的索引运行,还是扫描所有节点以尝试通过一次传递(或其他传递)来获取所需的信息?

您可以使用Cypher hints来尝试帮助规划器选择正确的选择器,但是在您的情况下,请使用第一个查询。对于Cypher计划者而言,第一个查询更容易进行计划,并且计划者实际上会缓存计划,因此无需在每次重新运行时都知道该做什么。 (第二个查询也可以,但是据我所知,它只是试图(并且失败)重现使用参数化查询的性能提升,所以为什么不只使用内置的Neo4j?)。 / p>