Python neo4j-改进密码查询

Python neo4j-改进密码查询,python,graph,neo4j,cypher,Python,Graph,Neo4j,Cypher,我有一个性能关键型应用程序,它必须基于正则表达式匹配将多个节点匹配到另一个节点。我目前的查询如下: 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 但是,此查询运行速度非常慢(在

我有一个性能关键型应用程序,它必须基于正则表达式匹配将多个节点匹配到另一个节点。我目前的查询如下:

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毫秒)。 该图包含大约500K个节点,大约10K将与正则表达式匹配

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

编辑:

当我在多人多线程上运行这个查询时,我得到一个
transinerror
异常

neo4j.exceptions.TransientError:ForScient[3]无法在节点(1889)上获取ExclusiveLock{owner=ForScient[14]},因为该锁的持有者正在等待ForScient[3]。

编辑2:

Person:name
是唯一的,并且已编制索引


Animal:name\u 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
这样,如果存在多个匹配项,则只会尝试一次合并,并且一旦找到一个匹配项,则不会在同一宠物上尝试其他合并。这也允许Cypher对您的数据进行最佳优化


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

首先,首先,我将尽可能简化您的查询。在找到匹配项后,您现在这样做会浪费很多精力

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
这样,如果存在多个匹配项,则只会尝试一次合并,并且一旦找到一个匹配项,则不会在同一宠物上尝试其他合并。这也允许Cypher对您的数据进行最佳优化


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

Mark是否有10k:动物节点与正则表达式匹配,或者,您是否试图在输入中的多人之间循环此查询?请完整描述您的方法,并告知我们您是否有以下索引:Person(name)@InverseFalcon,您好,谢谢您的快速帮助。查询将针对许多人运行,每个人可能有宠物,也可能没有宠物(取决于他的
匹配规则
)。该查询旨在根据正则表达式连接每个人及其匹配的宠物(如果以正则表达式形式保存的宠物名称与人的匹配列表中的任何规则匹配)@InverseFalcon,另一个问题是,当我同时在多个用户上运行此查询时(多线程)我得到一个
TransientError
@LewisBushman您得到的错误是由于锁定问题,这是一个死锁异常。那么Mark是否有10k:Animal节点与正则表达式匹配,或者您是否试图在输入中的多个人上循环此查询?请完整描述您的方法,并告知我们您是否有以下索引:Person(name)@InverseFalcon,您好,谢谢您的快速帮助。查询将针对许多人运行,每个人可能有宠物,也可能没有宠物(取决于他的
匹配规则
)。该查询旨在根据正则表达式连接每个人及其匹配的宠物(如果以正则表达式形式保存的宠物名称与人的匹配列表中的任何规则匹配)@InverseFalcon,另一个问题是,当我同时在多个用户上运行此查询时(多线程)我得到一个
TransientError
@LewisBushman您得到的错误是由于锁定问题,这是死锁异常。