2015-04-10 7 views
0

У меня есть сомнения относительно характеристик запроса Cypher в Neo4j. Ситуация такова: каждый узел моего графа имеет свойство, и я хотел бы подсчитать количество узлов с тем же свойством. Итак, мой основной запросNeo4j - Индексы и производительность

match (n:NodeLabel) 
with n.community as community, n.myid as myid 
match (m) where m.community = community 
return myid, count(m) as totcommunity 

Я создал индекс по недвижимости «сообщество»

create index on :NodeLabel(Community) 

Но выступления очень бедны: он принимает возрасты для графа с 200.000 узлами. Как я могу получить лучшие результаты?

Заранее спасибо

ответ

1

Вы забыли добавить Ла бель для второго матча, то он не может использовать индекс: Попробуйте это:

match (n:NodeLabel) 
match (m:NodeLabel) where m.community = n.community 
return n.myid as myid, count(*) as totcommunity 

Вы также можете убедиться, что он использует индекс предваряя ваш запрос с EXPLAIN и проверить план запроса.

+0

Спасибо за предложение EXPLAIN (я этого не знал). Но что, если у меня есть разные метки для узлов, и я бы хотел проверить свойство сообщества для всех из них? Вы говорите мне, что если я не укажу метку для узла, он не будет использовать индекс для указанного свойства? – besil

+0

Я не понимаю, как использовать предложение EXPLAIN. Не могли бы вы привести пример? большое спасибо – besil

1

Если вы хотите вернуть каждое определенное значение сообщества и количество узлов с этим значением:

MATCH (n:NodeLabel) 
RETURN n.community, COUNT(n); 

Если, вместо этого, вы хотите, чтобы получить счетчик числа узлы с тем же значением, как community конкретного узла (как определено мой myid), попробуйте этот запрос:

MATCH (n:NodeLabel {myid: 123}) 
WITH n.community AS c, n.myid AS myid 
MATCH (n:NodeLabel) 
WHERE n.community = c 
RETURN myid, n.community, COUNT(n); 
+0

Спасибо за ваш ответ. Да, это должно сработать. Но я хочу, чтобы определенные узлы были размером с сообществом, к которому они принадлежат, а не от размера всех сообществ. – besil

+0

Да, это так. Но проблема заключалась в том, чтобы использовать желаемую метку при сопоставлении узлов. Большое спасибо за ваш ответ – besil