簡體   English   中英

具有正則表達式和循環關系的Neo4j查詢節點會凍結瀏覽器

[英]Neo4j query nodes with regex and circular relationship freezes browser

我有一個圖,其中節點可以是“資源”或“外部依賴項”。

資源(又名微服務)可能具有以下關系:

  1. 資源-DEPENDS_ON-> externalDependency(maxDepth為1,一個方向)
  2. 資源-CONNECTS_TO-資源(任何深度,任何方向)

我目前正在使用以下查詢搜索所有資源及其關系(輸入或輸出):

Match (Resource)-[:CONNECTIONS*0..]-(ResourceDependency)-[:DEPENDS_ON*0..]-(ExternalDependency) 
Where Resource.name =~ '.*service_name.*' 
Return Resource, ResourceDependency, ExternalDependency

由於資源可以相互依賴,因此它們可以形成循環關系。 當發生這種情況並且屬於該圓的節點之一符合“名稱”條件時,查詢將永遠不會結束,並且neo4j瀏覽器最終會凍結。

如果我嘗試將CONNECTIONS depth / maxHops降低到八(* 0..8),則效果很好。 不幸的是,我已經擁有比這更大的關系,所以這不是一個可行的解決方案(它們只是不形成任何循環關系。)。

更新:

將maxHops設置為大於8的任何值會使Neo4j瀏覽器崩潰。

由於“資源”節點之間可以具有N個深度關系(並最終形成循環引用),因此查詢需要遍歷所有圖,以獲取所有資源節點的進出關系及其(一個深度)外部依存關系。

題:

如何在不存在循環關系性能問題的情況下實現此“ where”子句?

以下查詢可能更適合您。 如果沒有,您可能想嘗試在一個或多個可變長度路徑上設置合理的上限。 您可能可以比以前嘗試過更高的限制。

MATCH (resource:Resource)-[:CONNECTIONS*0..]->(resourceDependency)
WHERE resource.name =~ '.*service_name.*' AND (resourceDependency)-[:DEPENDS_ON]->()
WITH resourceDependency, COLLECT(resource) AS resources
MATCH (resourceDependency)-[:DEPENDS_ON*]->(externalDependency)
RETURN resourceDependency, resources, COLLECT(externalDependency) AS externalDependencies;

查詢:

  1. 假設您的資源節點具有“ Resource標簽,並使用它。 如果未指定標簽,則neo4j必須掃描數據庫中的每個節點以查看其是否具有:CONNECTIONS:DEPENDS_ON關系。 如果指定標簽,則neo4j可以僅掃描Resource節點。
  2. 指定所有關系的方向,這樣可以迅速消除查詢當前進行​​的所有關系遍歷的一半。
  3. 使用[:CONNECTIONS*0..]獲取所有依賴項,包括resource本身。
  4. 包括以下測試: (resourceDependency)-[:DEPENDS_ON]->() ,僅獲取具有傳出:DEPENDS_ON關系的resourceDependency節點。
  5. 對於每個此類resourceDependency ,聚合依賴於該resources所有resources 副作用是,這確保了在此之后我們僅以不同的resourceDependency節點結束。 我們之所以進行聚合,是因為resourceDependency可能被大量resourceDependency所依賴,因此,在接下來的步驟中,我們希望確保我們嘗試一次為每個resourceDependency找到外部依賴關系。
  6. 查找每個resourceDependency所依賴的所有externalDependency節點。 注意,我們使用[:DEPENDS_ON*] ,它等效於[:DEPENDS_ON*1..] ,因為我假設resourceDependency也不能是externalDependency
  7. 返回每個resourceDependency ,一個依賴於它的resource節點的集合,以及它所依賴的externalDependency節點的集合。

Cypher的可變長度模式匹配正在尋找與該模式匹配的所有可能路徑,當您尋找不同的連接節點時,這並不是最有效的方法。

我們可以在APOC過程中使用路徑擴展器proc來匹配不同的可到達資源依賴節點,然后從那里匹配到可能的外部依賴。

MATCH (Resource) // you really should be using labels, WHERE CONTAINS, and indexes
WHERE Resource.name =~ '.*service_name.*' 
CALL apoc.path.subgraphNodes(Resource, {relationshipFilter:'CONNECTIONS'}) YIELD node as ResourceDependency
MATCH (ResourceDependency)-[:DEPENDS_ON*0..1]->(ExternalDependency)
RETURN Resource, ResourceDependency, ExternalDependency

請注意,您將看到重復的數據,因為可以交換Resource和ResourceDependency的節點。 如果您想減少這一點,可以在CALL之后添加以下內容:

...
WITH Resource, ResourceDependency
WHERE id(Resource) <= id(ResourceDependency)
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM