Как отфильтровать края по метке времени в neo4j?
У меня есть график вида:
(продукты: продукт)-[:in_stock {обновлено: отметка времени}]->(stock_items:StockItem {количество: q })-[: сохраненный_ат] -> (местоположения: местоположение)
Очевидно, что это еще не все, но вы понимаете суть. Ноды stock_item и ребра in_stock добавляются часто (местоположения и продукты не так уж и много), поэтому для каждой из этих диаграмм будет много таких отношений. Я хочу искать и фильтровать по отметке времени (миллисекунды с 1 января 1970 года), чтобы получить только самое последнее (максимальное значение) и, следовательно, вернуть текущее количество.
Я не могу понять, как сделать эту фильтрацию. Есть идеи?
1 ответ
Рассмотрим модель данных графа ниже. Дни связаны в связанном списке, но они содержат метки времени. Если я хочу собрать Stats
узлы между диапазонами, я должен сначала выбрать в эти дневные узлы, а затем я могу выбрать Stats
узлы, которые в фиолетовый. Оттуда я могу указать, что эти фиолетовые узлы должны быть подключены к Group
узел в желтом, который подключен кLocation
что я уточняю.
Теперь, если я переведу этот шаблон на 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 самых последних элементов.