2015-06-05 3 views
3

В настоящее время я пытаюсь этот запрос на Neo4j 2.2.2Neo4j не используя индексы

Во время этого поста, мы не маркированы любые узлы, но, как мы недавно повышен с Neo4j 1.x. поэтому у нас нет возможности использовать предложение USING.

Я пытаюсь использовать индексы, но заканчивая полным сканированием таблицы.

START pfComp=node:Company('id:2403226') , ptComp=node:Company('id:1946633') 
OPTIONAL MATCH 
    (pfComp)<-[c:CHILD_OF*]-(cfComp) 
WITH collect(id(cfComp)) as cfCompIds, ptComp, pfComp 
OPTIONAL MATCH 
       (ptComp)<-[c2:CHILD_OF*]-(ctComp) 
WITH cfCompIds, collect(id(ctComp)) AS ctCompIds 
MATCH 
       (fComp) -[fR:PARTICIPATES_IN]-> cdeals <-[tR:PARTICIPATES_IN]-(tComp) 
WHERE 
       (fComp.id = 2403226 or id(fComp) in cfCompIds) and 
       (tComp.id = 1946633 or id(tComp) in ctCompIds) 
RETURN fComp, tComp, cdeals 

Cypher версия: CYPHER 2.2, планировщик: СТОИМОСТЬ. 1305292 всего дБ хитов в 79128 мс.

Любая помощь по этому поводу будет высоко оценена.

Ниже приведен полный вывод команды профиля.

This is the explain plan for the query

Начало часть запроса выполняет быстро:

profile START pfComp=node:Company('id:2403226') , ptComp=node:Company('id:1946633') 
OPTIONAL MATCH 
    (pfComp)<-[c:CHILD_OF*]-(cfComp) 
WITH collect(id(cfComp)) as cfCompIds, ptComp, pfComp 
OPTIONAL MATCH 
       (ptComp)<-[c2:CHILD_OF*]-(ctComp) 
return cfCompIds, collect(id(ctComp)) AS ctCompIds 

Cypher версия: CYPHER 2.2, планировщик: стоимость. Всего 836 хитов в секунду - 582 мс.

enter image description here

+0

Возможно, у вас есть опечатка здесь? Вы используете идентификаторы, которые вы еще не инициализировали раньше, поэтому он должен выполнить очень плохую полную сцену и развернуть: «ОПЦИОНАЛЬНЫЙ МАТЧ (ptComp) <- [c2: CHILD_OF *] - (ctComp)' –

+0

, здесь они имеют непоследовательные способы определения их поиск, для поиска свойств вы пропустите ярлык, а идентификатор поиска id() с поиском прокрутки я разделил его на две части объединения. –

+0

Michael Hunger: часть запроса попрошайничает: профиль START pfComp = node: Company ('id: 2403226'), ptComp = node: Company ('id: 1946633') ДОПОЛНИТЕЛЬНАЯ МАТЧА (pfComp) <- [c: CHILD_OF *] - (cfComp) WITH collect (id (cfComp)) как cfCompIds, ptComp, pfComp ДОПОЛНИТЕЛЬНАЯ МАТЧА (ptComp) <- [c2: CHILD_OF *] - (ctComp) return cfCompIds, collect (id (ctC omp)) AS ctCompIds Результат: Cypher версия: CYPHER 2.2, планировщик: СТОИМОСТЬ. Всего 836 хитов в секунду - 582 мс. –

ответ

2

Ваша вторая часть выглядит как реляционная присоединиться, или дополнительный поиск (например, п + 1 выбрать). Возможно, вместо этого используйте графическую модель? И запрос становится проще.

Итак, вы должны вычислить fComp и tComp с начальными совпадениями, из-за *0.. он включает в себя pfComp и ptComp каждый.

Тогда у вас есть перекресток между fComp и tComp за последний матч.

Пожалуйста, попробуйте его и посмотреть, как это тарифы:

MATCH (pfComp:lCompany)<-[c:CHILD_OF*0..]-(fComp:lCompany) 
WHERE pfComp.id = 2403226 
// reduce cardinality for following match 
WITH collect(distinct fComp) as companies1 
MATCH (ptComp:lCompany)<-[c2:CHILD_OF*]-(tComp:lCompany) 
WHERE ptComp.id = 1946633 
// create cross product between fComp and tComp 
UNWIND companies1 as fComp 
MATCH (fComp) -[fR:PARTICIPATES_IN]->(cdeals)<-[tR:PARTICIPATES_IN]-(tComp) 
RETURN fComp, tComp, cdeals; 
+0

Не ожидал получить более высокую производительность для этого, но вы увеличили производительность в 3 раза. Благодарю вас, сэр. Версия Cypher: CYPHER 2.2, планировщик: COST. Всего 40525 хитов в секунду за 307 мс. –

+0

Хорошие времена! Используйте «График Люк». Пожалуйста, примите ответ, если это будет нормально для вас. Другой способ - использовать операции с графами (развернуть) вместо тысяч поисков индексов. –

1

Там являются индекс запросов в вашем профиле (NodeByQueryIndex).

Вы можете определить, какой индекс вы хотите использовать в вашем запросе:

MATCH (n:Swedish) 
USING INDEX n:Swedish(surname) 
WHERE n.surname = 'Taylor' 
RETURN n 

См http://neo4j.com/docs/stable/query-using.html

+0

Мы находимся на устаревших индексах. ДБА просто помещает метки, я буду повторять с предложением USING с новыми мечеными узлами. –

1

Наше решение было создавать ярлыки (lCompany) и добавить новый тип индекса на Company.id column (CREATE INDEX ON: lCompany (id)).

Запрос затем переделаны, чтобы использовать новый индекс:

OPTIONAL MATCH 
    (pfComp:lCompany)<-[c:CHILD_OF*]-(cfComp:lCompany) 
WHERE pfComp.id = 2403226 
WITH 
    collect(cfComp.id) as cfCompIds 
    , pfComp 
OPTIONAL MATCH 
     (ptComp:lCompany)<-[c2:CHILD_OF*]-(ctComp:lCompany) 
WHERE ptComp.id = 1946633 
WITH cfCompIds, 
     collect(ctComp.id) AS ctCompIds, 
     pfComp, ptComp 
MATCH 
     (fComp:lCompany) -[fR:PARTICIPATES_IN]-> cdeals <-[tR:PARTICIPATES_IN]-(tComp:lCompany) 
USING INDEX fComp:lCompany(id) //tComp:lCompany(id) 
WHERE 
       ( 
        fComp.id in (cfCompIds + [2403226]) 
       ) 
       and 
       (
        tComp.id in (ctCompIds + [1946633]) 
       ) 
RETURN fComp, tComp, cdeals 

Там может быть futher оптимизаций, которые можно сделать, но это, насколько мы пришли до сих пор.

Результаты профилировщика теперь:

Cypher версия: CYPHER 2,2, Планировщик: COST. Всего 134151 удаленных просмотров в 1498 мс.

Это новый профиль после щипка:

enter image description here

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