Neo4j需要一分钟以上的时间来完成查询

Neo4j需要一分钟以上的时间来完成查询,neo4j,Neo4j,我使用的是neo4j版本3.0.3。我已经对100000个数据执行了以下查询。执行需要一分钟以上的时间。如何减少执行时间 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 C

我使用的是neo4j版本3.0.3。我已经对100000个数据执行了以下查询。执行需要一分钟以上的时间。如何减少执行时间

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)

所有从未去过坎普尔或海得拉巴的消费者

MATCH (d:Consumer)-[:HAS_VISITED_LOCATION]->(l:Location)
WHERE (l.AreaName<>"hyderabad" AND l.AreaName<>"kanpur")
RETURN COUNT(d.MID)
匹配(d:消费者)-[:已访问位置]->(l:位置)
其中(l.AreaName“海得拉巴”和l.AreaName“坎普尔”)
返回计数(d.MID)

添加替代方法。由于您只需要未访问任何一个位置的:消费者的计数,我们可以得到该位置的消费者的计数,然后从:消费者的总数中减去

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操作时有点挑剔,因此将其放在开头应该可以保证这种方法,与其选择一种不同的没有表现的方式,不如选择一种不同的方式。

这对那些拥有HAS\u VISITED\u位置关系的用户有效,但我也希望没有HAS\u VISITED\u位置关系的用户计数。尝试添加可选关键字,如可选匹配(d:消费者)-[:HAS\u VISITED\u位置]>(l:位置)其中(l.AreaName“海得拉巴”和l.AreaName“坎普尔”)返回计数(d.MID)此查询不适用于访问过海得拉巴和/或坎普尔及其他地点的消费者。例如,访问过坎普尔和金奈的消费者。匹配会考虑消费者和他们访问过的所有地点。带有kanpur的行将被过滤掉。但与同一位消费者和channai的争吵将被搁置
l
,该位置将绑定到chennai位置。此外,返回节点属性的计数比获取节点本身的计数效率低。避免不必要的属性访问是一个好主意。是否在
:Location(AreaName)
上创建索引?尚未创建索引。告诉我们结果。