Neo4j Cypher返回总节点数和有限集
是否可以在单个密码查询中提取有限的节点集和节点总数Neo4j Cypher返回总节点数和有限集,neo4j,cypher,Neo4j,Cypher,是否可以在单个密码查询中提取有限的节点集和节点总数 match (n:Molecule) with n, count(*) as nb limit 10 return {N: nb, nodes: collect(n)} 上面的查询正确地返回节点,但返回1作为节点数。我当然理解为什么它返回1,因为没有分组,但不知道如何更正它。下面的查询返回整行数的计数器(我想这是需要的)。然后它再次匹配并限制您的搜索,但原始计数器仍然可用,因为它是通过WITH-语句执行的 MATCH (n:Mole
match (n:Molecule) with n, count(*) as nb limit 10 return {N: nb, nodes: collect(n)}
上面的查询正确地返回节点,但返回1作为节点数。我当然理解为什么它返回1,因为没有分组,但不知道如何更正它。下面的查询返回整行数的计数器(我想这是需要的)。然后它再次匹配并限制您的搜索,但原始计数器仍然可用,因为它是通过
WITH
-语句执行的
MATCH
(n:Molecule)
WITH
count(*) AS cnt
MATCH
(n:Molecule)
WITH
n, cnt LIMIT 10
RETURN
{ N: cnt, nodes:collect(n) } AS molecules
以下是另一种解决方案:
match (n:Molecule) return {nodes: collect(n)[0..5], n: length(collect(n))}
30k节点为84毫秒,较短,但效率不如上述由wassgren提出的方法。如果匹配实际上相当复杂,该怎么办?复制它会导致性能损失吗,或者Neo4j足够聪明,可以重用第一场比赛的结果吗?刚刚用一场非常激烈的比赛测试了这一点。不,Neo4j不够聪明。没有计数部分需要44-45秒,计数为89-90秒。这就像运行两次查询,因此不需要将查询组合起来@SzczepanHołyszewski是否可以将其与
where
语句结合起来?基本上,我不需要节点总数。我需要满足“某些”条件的节点数。它可能比以前的解决方案占用更多内存。我们在这里讨论的是数百万个包含分子描述的分子节点(SMILES string,INCHI key,base64分子PNG的转换。为什么你的解决方案需要更多的内存?我不明白。我们只返回结果的一小部分。这是因为collect
语句吗?我是说使用collect的解决方案,我怀疑它会在内存中加载收集的节点,如果是这样,则集合将包含所有节点。)s标记为分子…百万。谢谢。也许Neo4j在collect
之前对索引语句进行了优化。而且,我认为你的答案应该是答案。前一个答案只会让复杂性变得更糟。他们只需串行执行2个查询。相反,他们可以并行执行2个查询。我尝试使用这个使用一组相对较大的节点(290万个节点)进行查询。我使用了一个查询,如可选匹配(x:Card),其中((TRUE))返回ID(x),x跳过0限制10
,在这290万张卡中获得10张卡。它在大约1或2毫秒内执行。当我尝试可选匹配(x:Card)时((TRUE))返回收集(ID(x))[0..10],collect(x)[0..10],length(collect(x))
它在4500毫秒内第一次执行。在第二次运行中,它在2700毫秒内执行。它看起来不太糟糕,但速度肯定较慢。