如何在neo4j中按时间戳过滤边缘?

时间:2014-07-15 01:22:17

标签: neo4j cypher neography

我有一张表格图表:

(产品:产品) - [:in_stock {updated:timestamp}] - >(stock_items:StockItem {quantity:q}) - [:stored_at] - >(locations:Location)

显然更多的是,但你得到了要点。 stock_item节点和in_stock边缘经常被添加(位置和产品不是那么多),因此对于这些图中的每一个,将存在许多这些关系。我想通过时间戳(自1970年1月1日以来的毫秒)进行搜索和过滤,以仅提取最近的(最大值)并返回当前数量。

我无法想象如何进行过滤。有任何想法吗?

1 个答案:

答案 0 :(得分:4)

考虑下面的图形数据模型。这些日期在链表中连接,但它们包含时间戳。如果我想收集范围之间的Stats节点,我必须首先选择那些日节点,然后我可以选择紫色的Stats节点。从那里我可以指定那些紫色节点必须连接到黄色的Group节点,该节点连接到我指定的Location

Graph-based analytics

现在,如果我将此模式转换为Cypher,我会得到以下结果:

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个最新项目。