繁体   English   中英

neo4j-改善Cypher查询

[英]neo4j - Improving a Cypher query

我有一个性能至关重要的应用程序,该应用程序必须根据正则表达式匹配将多个节点与另一个节点进行匹配。 我当前的查询如下:

MATCH (person: Person {name: 'Mark'})
WITH person
UNWIND person.match_list AS match
MATCH (pet: Animal) 
WHERE pet.name_regex =~ match
MERGE (person)-[:OWNS_PET]->(pet) 
RETURN pet

但是,此查询运行速度非常慢(在我的工作站上大约500毫秒)。 该图包含大约50万个节点,大约1万个将与正则表达式匹配。

我想知道是否有一种更有效的方法来重新编写此查询以使其工作相同,但可以提高性能。

编辑:

在多人多线程上运行此查询时,出现TransientError异常

neo4j.exceptions.TransientError: ForsetiClient[3] can't acquire ExclusiveLock{owner=ForsetiClient[14]} on NODE(1889), because holders of that lock are waiting for ForsetiClient[3].

编辑2:

Person:name是唯一的并已建立索引

Animal:name_regex未编制索引

首先,我将首先尽可能简化您的查询。 找到匹配后,您的操作方式现在会浪费很多精力

MATCH (person: Person {name: 'Mark'}), (pet: Animal)
WHERE ANY(match in person.match_list WHERE pet.name_regex =~ match)
MERGE (person)-[:OWNS_PET]->(pet) 
RETURN pet

这样一来,如果有多个匹配项,则仅尝试进行1次合并,一旦找到一个匹配项,将不再尝试对同一只宠物进行其余的合并。 这也使Cypher可以根据您的数据进行最大程度的优化。

为了进一步提高密码,您将需要优化数据。 例如,正则表达式匹配非常昂贵(需要进行节点+字符串扫描),如果可以在人与人之间大量重复使用match语句,则最好将它们分解成一个节点,然后连接到那些节点上,以便一个人的工作正则表达式匹配可以在任何重复的地方重复使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM