我有一些样本推文存储为neo4j。以下查询可查找特定国家/地区的热门标签。由于状态类型节点的时间过滤器位于where子句中,并且会减慢响应速度,因此需要花费大量时间。是否可以将此过滤器移至MATCH子句,以便在找到关系之前对状态节点进行过滤?
match (c:country{countryCode:"PK"})-[*0..4]->(s:status)-[*0..1]->(h:hashtag) where (s.createdAt >= datetime('2017-06-01T00:00:00') AND s.createdAt
>= datetime('2017-06-01T23:59:59')) return h.name,count(h.name) as hCount order by hCount desc limit 100
谢谢
答案 0 :(得分:1)
正如我的评论中所述,属性的谓词是在MATCH子句中还是在WHERE子句中都没有关系,因为这只是语法糖,并且由查询计划程序以相同的方式解释。
您可以使用PROFILE或EXPLAIN查看查询计划,以查看其工作情况。 PROFILE将为您提供更多信息,但必须实际执行查询。您可以尝试使用planner hints来迫使计划者以不同的方式计划比赛,这可能会产生更好的方法。
您将要确保在:status(createdAt)上具有索引。
您还可以尝试稍微更改匹配项,然后将连接到相关国家/地区的部分移到WHERE子句中。同样,最好是根据主题标签节点本身来获得计数(假设给定名称只有一个:hashtag节点),因此您可以在进行属性访问之前进行排序和限制:
MATCH (s:status)-[*0..1]->(h:hashtag)
WHERE (s.createdAt >= datetime('2017-06-01T00:00:00') AND s.createdAt
>= datetime('2017-06-01T23:59:59'))
AND (:country{countryCode:"PK"})-[*0..4]->(s)
WITH h, count(h) as hCount
ORDER BY hCount DESC
LIMIT 100
RETURN h.name, hCount