NEO4J查询排除某些节点

时间:2016-08-25 22:44:58

标签: neo4j

使用与此类似的数据模型:

(u:User)-[:POSTED]->(p:Post {created_at: 123)-[:ABOUT]->(t:Topic {name: "Blue")

找到使用{created_at:123}发布/创建帖子的不同用户数的最佳方法是什么?并且还没有关于“blue”主题的{created_at:124}帖子。

我能得到的最近的是收集ID然后排除它们,但是当你有很多节点(数百万)时,它不会扩展。

[EDITED]

我还需要将created_at次指定为范围。

2 个答案:

答案 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_atTopic.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将查询提供给查询。