Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j Cypher返回总节点数和有限集_Neo4j_Cypher - Fatal编程技术网

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毫秒内执行。它看起来不太糟糕,但速度肯定较慢。