使用与此类似的数据模型:
(u:User)-[:POSTED]->(p:Post {created_at: 123)-[:ABOUT]->(t:Topic {name: "Blue")
找到使用{created_at:123}发布/创建帖子的不同用户数的最佳方法是什么?并且还没有关于“blue”主题的{created_at:124}帖子。
我能得到的最近的是收集ID然后排除它们,但是当你有很多节点(数百万)时,它不会扩展。
[EDITED]
我还需要将created_at
次指定为范围。
答案 0 :(得分:1)
此查询允许您指定created_at
范围。在此示例中,期望的范围是[123..130],不期望的“蓝色”范围是[131..140]。在实际查询中,范围端点应由[Browsable (false)]指定。
MATCH (user:User)-[:POSTED]->(p1:Post)
WHERE 123 <= p1.created_at <= 130
WITH user
OPTIONAL MATCH (user)-[:POSTED]->(p2:Post)-[:ABOUT]->(:Topic{name:"Blue"})
WHERE 131 <= p2.created_at <= 140
WITH user, p2
WHERE p2 IS NULL
RETURN COUNT(DISTINCT user) AS userCount;
OPTIONAL MATCH
子句与不受欢迎的“Blue”路径匹配,WHERE p2 IS NULL
子句将过滤掉具有任何此类路径的user
个节点
答案 1 :(得分:0)
假设您有Post.created_at
和Topic.name
(速度)的索引,这应该有效:
MATCH (user:User)-[:POSTED|CREATED]->(:Post{created_at:123})
WHERE NOT EXISTS ( (user)-[:POSTED|CREATED]->(:Post{created_at:124})-[:ABOUT]->(:Topic{name:"Blue"}) )
RETURN count(DISTINCT user) as userCount
值得对该查询进行分析,如果它没有使用created_at和name索引,请在USING INDEX
之后使用MATCH
将查询提供给查询。