2015-01-16 4 views
0

Я разрабатываю совершенно новое приложение, которое много полагается на даты. В принципе, каждый запрос, который я делаю, начинается с ряда дат. Я сделал дату дерева, как это:Соотношение отношений по пути - Проблемы с производительностью

(:Date)-[:NEXT_DAY]->(:Date)-[:NEXT_DAY]-> .... 

Я обнаружил, что использование [:NEXT_DAY] отношений является очень эффективным для запроса диапазонов и результатов заказа.

У меня есть много документов, связанных с этими днями:

(:Document)-[:PUBLISHED_ON]->(:Day) 

Более основной запрос должен соответствовать всем документам, опубликованных по дате пути. Это мой фактический запрос:

MATCH DatePath = (b:Date)-[:NEXT*30]->(e:Date {day:20150101}) 
UNWIND nodes(DatePath) as date 

WITH date 
MATCH (doc:Document)-[:PUBLISHED_ON]->(date) 

RETURN count(doc) 

Запрос занимает около секунды, чтобы вернуть менее 30 тыс. Узлов. Поэтому мой вопрос: это нормальное поведение? Или, может быть, есть лучший способ сопоставить отношения по пути?

ответ

3

Есть три оптимизации вы можете сделать:

Прежде всего, убедитесь, что ваш день свойство проиндексировано:

CREATE INDEX ON :Date(day); 

Во-вторых, вместо сопоставления первого по шаблону, который приведет к глобальным граф поиска, попробуйте разбить запрос и начать с помощью индекса день:

MATCH (e:Date {day:20150101}) 
WITH e 
MATCH DatePath = (b:Date)-[:NEXT*30]->(e) 
UNWIND nodes(DatePath) as date 
WITH date 
MATCH (doc:Document)-[:PUBLISHED_ON]->(date) 
RETURN count(doc) 

в-третьих, если вы уверены, что б узлы для (б: Дата) - [: СЛЕДУЮЩИЙ * 30] -> (е) будет иметь Дата этикетки и то же самое для DOc узлов в последнем матче, опуская ярлык будет более производительным, вы можете посмотреть на мой ответ здесь для деталей:

Neo4j: label vs. indexed property?

MATCH (e:Date {day:20150101}) 
WITH e 
MATCH DatePath = (e)<-[:NEXT*30]-(b) 
UNWIND nodes(DatePath) as date 
WITH date 
MATCH (doc)-[:PUBLISHED_ON]->(date) 
RETURN count(doc) 
+0

Мой ': Дата (день)' INDEX был в порядке, но вы абсолютно правы: сначала раскалываете запрос и опускаете сделанное большое улучшение! Я пришел с 1800 мс до 80 мс! Большое спасибо за вашу помощь – Creaforge

+3

Посмотрите на GraphAware TimeTree, может представлять интерес для вашего прецедента: https://github.com/graphaware/neo4j-timetree –