2015-08-10 4 views
3

Я использую версию сообщества Neo4j v2.2.3. Я хотел бы запросить количество узлов по метке и количество отношений по типу. Я попытался с:Как запросить статистику схемы в Neo4j

MATCH (n:NODE_LABEL) RETURN COUNT(DISTINCT n) 

и

MATCH()-[r:REL_TYPE]-() RETURN COUNT(DISTINCT r) 

Хотя первый запрос довольно быстро (2.5S), второй запрос не заканчивается через несколько минут (есть ~ 100 миллионов отношения некоторых типов). Однако, согласно [1], такая информация хранится в Neo4j. Таким образом, я ожидал немедленного ответа на оба случая. Можно ли получить эту информацию по-другому?

Заранее благодарен!

[1] http://neo4j.com/docs/stable/query-schema-statistics.html

ответ

0

Я не знаю о том, как планировщик запросов работает с использованием графов типов отношений, но вы можете попробовать это несколько более простой запрос:

MATCH()-[r:REL_TYPE]->() RETURN COUNT(*) 

Поскольку нет никакого DISTINCT , планировщик запросов может с большей вероятностью использовать эти статистические данные. Также указывая направление, убедитесь, что отношения не засчитываются дважды (что неверно и, вероятно, медленнее)

Но если у вас PROFILE этот запрос, я подозреваю, что он проходит через каждый узел в базе данных и после узлы. Neo4j сохраняет индексы схемы по умолчанию для меток, но не для типов отношений. Так что, если вы не знаете, что отношения всегда начинается с узла определенной метки (или этикетки), это помогло бы Neo4j путем указания, что:

MATCH (:SomeLabel)-[r:REL_TYPE]->() RETURN COUNT(*) 

или

MATCH (n)-[r:REL_TYPE]->() 
WHERE n:SomeLabel OR n:SomeOtherLabel 
RETURN COUNT(*) 
+0

Действительно, ваши предложения (указать метку места происхождения и направление отношения) дают ускорение, но все еще слишком медленно для подсчета многих отношений (~ миллионов). – sancho

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