簡體   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