Как отфильтровать края по метке времени в 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 самых последних элементов.

Другие вопросы по тегам