2014-07-15 91 views
1

我有以下形式的曲線圖:如何在neo4j中通過時間戳來過濾邊緣?

(產品:產品) - [:IN_STOCK {更新:時間戳}] - >(stock_items:StockItem {量:Q}) - [:stored_at] - >(位置:地點)

顯然更多的是,但你得到的主旨。 stock_item節點和in_stock邊緣經常被添加(位置和產品不是很多),因此對於這些圖表中的每一個,都會有很多這種關係。我想通過時間戳(自1970年1月1日以來的毫秒)搜索並過濾,以僅拉取最近的(最大值)並返回當前數量。

我無法確定如何做這個過濾。有任何想法嗎?

+0

嗨,而不是描述圖 - 你能告訴我們你的模型代碼和你嘗試工作的代碼嗎?歡呼:) –

+1

我已經把Ruby和rails標籤關閉了。這是無關緊要的。這個查詢是關於圖。我需要密碼或neptigy答案。與模型無關。 –

回答

4

考慮下面的圖形數據模型。日子連接在一個鏈表中,但它們包含時間戳。如果我想要收集範圍之間的節點,我必須先選擇那些節點,然後選擇紫色的節點。從那裏我可以指定那些紫色節點必須連接到與我指定的Location連接的黃色的Group節點。

Graph-based analytics

現在,如果我把這種模式爲暗號,我得到如下:

MATCH (d:Day) 
WHERE d.timestamp > 123456789 AND d.timestamp < 234567891 
MATCH (topic:Topic), (location:Location { city: "San Francisco" }) 
WHERE topic.name in ["NoSQL"] 
WITH topic, location, day 
MATCH (topic)<-[:HAS_TOPIC]-(group:Group)-[:LOCATED_IN]->(location) 
WITH DISTINCT group, day 
MATCH (group)-[:HAS_MEMBERS]->(stats:Stats)-[:ON_DAY]->(day) 
WITH DISTINCT (day.month + "/" + day.day + "/" + day.year) as day, 
       group.name as group, 
       stats.count as members, 
       day.timestamp as timestamp 
ORDER BY timestamp 
RETURN day, group, members 

如果你重構你的模型轉in_stock關係與時間戳的節點,模型節點作爲鏈表,那麼你可以通過指定模式來選擇最近的:

MATCH (product:Product { sku: 1234 })-[:HAS_UPDATE]->(update:InStock) 
WHERE NOT (update)-[:NEXT]->() 
WITH update 
MATCH (update)-[:STOCK_ITEMS]->(stockItems:StockItem), 
     (stockItems)<-[:STORED_AT]-(location:Location) 
RETURN location.name, stockItems.quantity 

這是最高性能的方式來做到這一點。要管理鏈接列表中的指針,這些指針允許您在範圍內(時間戳之間)查詢並查詢N個最近的項目。

+2

這裏有一些很棒的建議。我會試一試。我開始認爲我不得不重新思考我用來模擬這些信息的子圖的形狀。 –

+0

第一個查詢需要將「標記」的使用更改爲「主題」,以使圖形精確。 –

+0

感謝拜倫,是的,這是正確的。 –