2017-02-04 4 views
0

Я использую версию neo4j 3.0.3. Я выполнил приведенный ниже запрос для 100 000 данных. Выполняется более одной минуты. Как сократить время выполнения?Neo4j занимает больше минуты, чтобы заполнить запрос

MATCH (c:Consumer)-[:HAS_VISITED_LOCATION]-(l:Location) 
WHERE l.AreaName="hyderabad" OR l.AreaName="kanpur" 
WITH l 
MATCH(d:Consumer) 
WHERE NOT (d)-[:HAS_VISITED_LOCATION]-(l) 
RETURN COUNT(DISTINCT d.MID) 
+0

Вы создаете индекс на ': Location (AreaName)'? –

+0

еще не создан –

+1

Сделайте их. И расскажите нам о результатах. –

ответ

-1

Все потребители, которые никогда не посещали Канпур или Хайдарабад

MATCH (d:Consumer)-[:HAS_VISITED_LOCATION]->(l:Location) 
WHERE (l.AreaName<>"hyderabad" AND l.AreaName<>"kanpur") 
RETURN COUNT(d.MID) 
+0

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

+0

попробуйте добавить Необязательное ключевое слово, как этот ФАКУЛЬТАТИВНЫМ MATCH (d: Consumer) - [: HAS_VISITED_LOCATION] -> (л: Location) WHERE (l.AreaName <> "Хайдарабад" И l.AreaName <> "Канпур") RETURN COUNT (d.MID) –

+0

Этот запрос не будет работать для потребителей, которые посетили гидерабад и/или канпур и другие места. Например, потребитель, который превратил канпура и посетил ченнай. В матче рассматривается потребитель и все места, которые они посетили. Строка с канпуром будет отфильтрована. Но строка с тем же потребителем и каналом будет оставлена. 'L', местоположение, будет привязано к местоположению chennai. – InverseFalcon

0

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

MATCH (c:Consumer) 
WITH COUNT(c) as consumerCnt 
MATCH (c:Consumer)-[:HAS_VISITED_LOCATION]->(l:Location) 
WHERE l.AreaName="hyderabad" OR l.AreaName="kanpur" 
RETURN COUNT(DISTINCT c) - consumerCnt as count 

Отредактировано таким образом, чтобы мы сначала подсчитали всех клиентов. Neo4j немного уступает, когда он применяет операцию NodeCountFromStore, когда он выполняет запрос, поэтому размещение этого в начале должно гарантировать этот подход, вместо того, чтобы выбирать другое средство, которое не является исполнительным.

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