我有節點的分層結構,它們都具有一個自定義的分配排序屬性(數字)限制查詢。這裏有一個簡單的Cypher查詢重現:的Neo4j - 基於節點的排名
merge (p {my_id: 1})-[:HAS_CHILD]->(c1 { my_id: 11, sort: 100})
merge (p)-[:HAS_CHILD]->(c2 { my_id: 12, sort: 200 })
merge (p)-[:HAS_CHILD]->(c3 { my_id: 13, sort: 300 })
merge (c1)-[:HAS_CHILD]->(cc1 { my_id: 111 })
merge (c2)-[:HAS_CHILD]->(cc2 { my_id: 121 })
merge (c3)-[:HAS_CHILD]->(cc3 { my_id: 131 });
我掙扎的問題是,我常常需要根據相對於一些父節點的子節點上排名的決定,與regads到這種標識。因此,例如,節點c1
相對於節點p
具有1級(因爲它具有最小sort
屬性),c2
具有等級2,並且c3
具有等級3(最大sort
)。
那種決定我需要根據這些信息:顯示孩子只有前2個cX
節點。這裏就是我想:
cc1
和cc2
都存在,但cc3
是不是因爲c3
(其父)不是第一或p
的第二個孩子。下面是一個啞巴查詢:
match (p {my_id: 1 })-->(c)
optional match (c)-->(cc) where c.sort <= 200
return p, c, cc
問題是,這些sort
屬性自定義設置和進口的,所以我不知道哪個值將舉行兒童數2.
的方式我目前的解決方案是在導入過程中的排名吧,因爲我使用的是Oracle,這是很簡單 - 我只需要使用rank
窗口功能。但對我來說似乎很尷尬,我覺得可以有更優雅的解決方案。我試了下查詢和它的作品,但它看起來奇怪,它在更大的圖形非常慢:
match (p {my_id: 1 })-->(c)
optional match (c)-->(cc)
where size([ (p)-->(c1) where c1.sort < c.sort |c1]) < 2
return p, c, cc
下面是這個查詢的計劃和最昂貴的部分其實是在size
表達:
非常感謝您的擴大答覆,我已經將剖析計劃添加到我的問題。實際上,實際的DB需要索引和標籤,正如您在計劃中看到的那樣,而計劃中最昂貴的部分實際上就是具有大小的子句。話雖如此,你的查詢是非常高效的,所以我會說這是訣竅!再次感謝! –