[英]Neo4j query nodes with regex and circular relationship freezes browser
我有一個圖,其中節點可以是“資源”或“外部依賴項”。
資源(又名微服務)可能具有以下關系:
我目前正在使用以下查詢搜索所有資源及其關系(輸入或輸出):
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;
查詢:
Resource
標簽,並使用它。 如果未指定標簽,則neo4j必須掃描數據庫中的每個節點以查看其是否具有:CONNECTIONS
或:DEPENDS_ON
關系。 如果指定標簽,則neo4j可以僅掃描Resource
節點。 [:CONNECTIONS*0..]
獲取所有依賴項,包括resource
本身。 (resourceDependency)-[:DEPENDS_ON]->()
,僅獲取具有傳出:DEPENDS_ON
關系的resourceDependency
節點。 resourceDependency
,聚合依賴於該resources
所有resources
。 副作用是,這確保了在此之后我們僅以不同的resourceDependency
節點結束。 我們之所以進行聚合,是因為resourceDependency
可能被大量resourceDependency
所依賴,因此,在接下來的步驟中,我們希望確保我們嘗試一次為每個resourceDependency
找到外部依賴關系。 resourceDependency
所依賴的所有externalDependency
節點。 注意,我們使用[:DEPENDS_ON*]
,它等效於[:DEPENDS_ON*1..]
,因為我假設resourceDependency
也不能是externalDependency
。 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.