2016-04-29 71 views
1

:Product節點的集合,我要回最新的100一樣考慮全局查詢:的Neo4j/Cypher支架查詢的限制,以便通過最新的創建

MATCH (p:Product) RETURN p LIMIT 100 

從我可以看到它首先返回最老的節點。有沒有一種方法可以獲得最新的?

由於產品數量可能會達到數百萬,因此訂購不會成爲一種選擇。

UPDATE

我結束了創建一個密集的節點(:ProductIndex)。每次創建產品時,我都會將其添加到索引(:Product)-[:INDEXED]->(:ProductIndex)。隨着相對密集鏈節點將被最新的先排序,以便低於查詢將在上面

MATCH (p:Product)-[:INDEXED]->(:ProductIndex) 
RETURN p 
LIMIT 1000 

返回最新記錄我能夠始終保持指數固定大小的,因爲我並不需要保存完整的歷史記錄。

回答

2

是數據模型,使得產品連接列表(例如(:產品) - [:上] - >(:產品)

你能保持最近的節點的軌道要麼?與

一個時間戳,您可以輕鬆地找到或連接到最新的產品節點的另一節點。如果是這樣,你總是可以查詢出的是最近的類似以下內容的查詢。

match (max:Date {name: 'Last Product Date'})-->(latest:Product) 
with latest 
match p=(latest)-[:PREVIOUS*..100]->(:Product) 
return nodes(p) 
order by length(p) desc 
limit 1 

或者你選擇的東西

match (max:Date {name: 'Product Date'}) 
with max 
match p=(latest:Product)-[:PREVIOUS*..100]->(:Product) 
where latest.date = max.date 
return nodes(p) 
order by length(p) desc 
limit 1 

另一種仍然使用列表的方法可能是爲每個產品保留一個索引創建日期屬性。但是當尋找最近的選擇時,控制日期不會回到開始時間,因此您有一個較小的節點池(即不是數百萬)。然後在該較小的池上使用max函數來查找最近的節點,然後按照您想要的數量來追溯它。

match (latest:Product) 
where latest.date > {control_date} 
with max(latest.date) as latest_date 
match p=(product:Product)-[:PREVIOUS*..100]->(:Product) 
where product.date = latest_date 
return nodes(p) 
order by length(p) desc 
limit 1 

刪除鏈接列表中的節點非常簡單。如果您需要進行大量搜索並且您不想訂購這些產品,我認爲將這些產品保存在列表中是一個相當不錯的圖形應用程序。這是一個維護列表的例子。

match (previous:Product)<-[:PREVIOUS]-(product_to_delete:Product)<-[:PREVIOUS]-(next:Product) 
where product_to_delete.name = 'name of node to delete' 
create (previous)<-[:PREVIOUS]-(next) 
detach delete product_to_delete 
return previous, next 
+0

我認爲保留鏈接列表的訂購產品會使產品刪除變得複雜,因爲您需要維護rel鏈一致。其他方法我猜你可以有'(:ProductIndex)'節點並且有'(:Product) - [:INDEXED] - >(:ProductIndex)'關係。那麼你可以限制最新索引產品的數量。這種方式簡單的產品索引與極限匹配應該做的工作。 – drgraduss

+0

我不認爲管理鏈接列表中的刪除是繁重的 - 我用示例更新了答案。如果你真的不想這樣做,你可以總是索引日期或產品編號(假設遞增),並使用該屬性來清除最近的1000個左右,然後在該縮小列表上使用排序。 –