neo4j-如何仅匹配前n个关系

ulk*_*kas 6 neo4j cypher

有没有一种默认的方式如何仅匹配前n个关系(除了LIMIT n稍后过滤)?

我有这个查询:

START n=node({id})
MATCH n--u--n2
RETURN u, count(*) as cnt order by cnt desc limit 10;
Run Code Online (Sandbox Code Playgroud)

但假设n--u关系数量非常多,我想放宽此查询并以例如前100个随机关系为例,然后继续u--n2...

这是用于协作过滤任务的,并且假设用户之间的相似程度较低,我不想匹配所有用户,u但希望匹配随机子集。这种方法的性能应该更快-现在我的查询时间约为500毫秒,但希望将其降低到50毫秒以下。

我知道我可以将上面的查询分为2个单独的查询,但是仍然在第一个查询中它遍历所有用户,并且以后它会限制输出。我想限制match阶段的最大关联。

ean*_*533 4

您可以使用管道传输查询的当前结果WITH,然后使用LIMIT这些初始结果,然后在同一查询中继续:

START n=node({id})
MATCH n--u
WITH u
LIMIT 10
MATCH u--n2
RETURN u, count(*) as cnt 
ORDER BY cnt desc 
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

上面的查询会给出u找到的前 10 个,然后继续查找前 10 个匹配的n2

或者,您可以省略第二个LIMIT,您将获得前十个的所有匹配(这意味着如果它们与前 10 个匹配,您可能会返回十多个行)。n2uu

  • 第一个“limit 10”应该导致遍历器在找到前 10 个“u”后停止。它不应该处理所有可能的“u”。如果您怀疑它的处理量超出了应有的范围,您应该向 neo4j 提交错误。 (2认同)