我们可以在节点的MATCH子句中使用datetime过滤器而不是WHERE子句吗

时间:2018-08-02 14:12:33

标签: neo4j

我有一些样本推文存储为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

谢谢

1 个答案:

答案 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