Neo4j / Cypher查询语法反馈

时间:2013-12-17 20:42:53

标签: neo4j cypher

我正在开发一种reddit服务来学习Neo4j。 一切正常,我只想获得一些关于Cypher查询的反馈,以获取最新的新闻报道,作者和评论数量,喜欢和不喜欢。

我正在使用Neo4j 2.0。

MATCH comments = (n:news)-[:COMMENT]-(o)
MATCH likes = (n:news)-[:LIKES]-(p)
MATCH dislikes = (n:news)-[:DISLIKES]-(q)
MATCH (n:news)-[:POSTED_BY]-(r)
WITH n, r, count(comments) AS num_comments, count(likes) AS num_likes, count(dislikes) AS num_dislikes
ORDER BY n.post_date
LIMIT 20
RETURN *

opqr都是标签为user的节点。是否应将标签添加到查询中以加快速度?

你还有什么其他的东西我可以优化吗?

2 个答案:

答案 0 :(得分:1)

我想你想要摆脱多场比赛。 Cypher将对每个进行过滤,相互过滤,而不是获取所有信息。

我也会避免注释之类的路径,而是对要保存的节点进行计数。当你做MATCH xyz =(a) - [:COMMENT] - (b)然后xyz是一个路径,它包含源,关系和目标节点。

MATCH (news:news)-[:COMMENT]-(comment),(news:news)-[:LIKES]-(like),(news:news)-[:DISLIKES]-(dislike),(news:news)-[:POSTED_BY]-(posted_by) 
WHERE news.post_date > 0 
WITH news, posted_by, count(comment) AS num_comments, count(like) AS num_likes, count(dislike) AS num_dislikes 
ORDER BY news.post_date 
LIMIT 20 
RETURN *

答案 1 :(得分:1)

我会做这样的事情。

MATCH (n:news)-[:POSTED_BY]->(r)
WHERE n.post_date > {recent_start_time}
RETURN n, r, 
        length((n)<-[:COMMENT]-()) AS num_comments,
        length((n)<-[:LIKES]-()) AS num_likes,
        length((n)<-[:DISLIKES]-()) AS num_dislikes,
ORDER BY n.post_date DESC
LIMIT 20

为了加快速度并且没有对你的所有帖子进行新搜索,我可能会对post-date字段进行索引(假设它不包含时间信息)。然后在今天,昨天等发送此查询,直到您有20个帖子。

MATCH (n:news {post_date: {day}})-[:POSTED_BY]->(r)
RETURN n, r, 
        length((n)<-[:COMMENT]-()) AS num_comments,
        length((n)<-[:LIKES]-()) AS num_likes,
        length((n)<-[:DISLIKES]-()) AS num_dislikes,
ORDER BY n.post_date DESC
LIMIT 20