2016-04-29 3 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)' node и иметь '(: Product) - [: INDEXED] -> (: ProductIndex)' отношения. Затем вы можете ограничить число последних индексированных продуктов. Таким образом, простое соответствие индекса продукта с лимитом должно выполняться. – drgraduss

+0

Я не думаю, что управление удалением в связанном списке - это то, что onerous - я обновил ответ на примере. Если вы действительно не хотели этого делать, вы всегда можете индексировать дату или номер продукта (при условии увеличения) и использовать этот атрибут для удаления последних 1000 или около того, а затем использовать порядок в этом сокращенном списке. –

Смежные вопросы