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 有效地在所有元素中查找属性的最大值_Neo4j_Cypher - Fatal编程技术网

Neo4j 有效地在所有元素中查找属性的最大值

Neo4j 有效地在所有元素中查找属性的最大值,neo4j,cypher,Neo4j,Cypher,几乎我的neo4j数据库的所有元素都有一个属性,但该属性的名称在不同的标签中可能有所不同。我写了一个如下的查询 MATCH (n) MATCH ()-[e]-() unwind [n.start_t,e.start_t,n.end_t,e.end_t,n.begin,e.begin,n.end] as l return MIN(l) as min, MAX(l) as max 这运行得很好,但尽管我只有不到1000个元素,但它需要7秒的时间。如何使此查询更有效率 使用RDMS数据库,这些类型的

几乎我的neo4j数据库的所有元素都有一个属性,但该属性的名称在不同的标签中可能有所不同。我写了一个如下的查询

MATCH (n)
MATCH ()-[e]-()
unwind [n.start_t,e.start_t,n.end_t,e.end_t,n.begin,e.begin,n.end] as l
return MIN(l) as min, MAX(l) as max
这运行得很好,但尽管我只有不到1000个元素,但它需要7秒的时间。如何使此查询更有效率


使用RDMS数据库,这些类型的查询的工作速度要快得多

您的查询在
(n)
()-[e]-()
之间执行笛卡尔乘积,这可能就是它速度慢的原因

请改为执行以下操作:

MATCH (n)-[e]->()
unwind [n.start_t,e.start_t,n.end_t,e.end_t,n.begin,e.begin,n.end] as l
return MIN(l) as min, MAX(l) as max
编辑: 如果节点没有关系,请使用可选匹配:

MATCH (n)
OPTIONAL MATCH (n)-[e]->()
unwind [n.start_t,e.start_t,n.end_t,e.end_t,n.begin,e.begin,n.end] as l
return MIN(l) as min, MAX(l) as max

正如Frant指出的,这里的叉积正在扼杀你的表现。请注意,这不仅仅是所有节点和所有关系之间的交叉,它实际上是所有关系的2倍,因为在模式中没有方向,每个关系将匹配两次,每个方向一次

我认为最好先计算所有节点的最小值和最大值,然后计算所有关系的最小值和最大值,然后计算最终结果中的最终值(使用APOC在列表中获得最大值和最小值):

在节点中有最小值和最大值时,您可以返回到一行,并准备好处理其余的行,而不必考虑基数问题

编辑

这里的APOC函数是在一行中获取最小值或最大值的最干净的方法

否则,我们可能不得不这样做:

MATCH (n)
UNWIND [n.start_t, n.end_t, n.begin, n.end] as l
WITH min(l) as min, max(l) as max
MATCH ()-[e]->()
UNWIND [e.start_t, e.end_t, e.begin, e.end] as l
WITH min, max, min(l) as minR, max(l) as maxR
RETURN CASE WHEN min < minR THEN min ELSE minR END as min, CASE WHEN max > maxR THEN max ELSE maxR END as max
匹配(n)
展开[n.开始,n.结束,n.开始,n.结束]
最小值(l)为最小值,最大值(l)为最大值
匹配()-[e]->()
将[e.start\u t,e.end\u t,e.begin,e.end]展开为l
最小值、最大值、最小值(l)为最小值,最大值(l)为最大值
当最小值<最小值,然后最小值-最小值-最小值-结束为最小值,当最大值>最大值,然后最大值-其他值-最大值-结束为最大值时返回案例

对于每个节点/关系,是否只显示其中一个属性?或者单个节点/关系上可能有几个节点?每个节点都会有一个或两个节点。如果有一些节点没有任何关系,则会出现什么情况?我不知道笛卡尔积。为什么要这样做?您有两个未连接的模式,它类似于SQL查询,在
FROM
子句中有两个表,没有任何其他条件。您为什么要使用apoc来完成这样一件简单的事情。我们不能使用cql吗?Cypher的min()和max()是聚合函数,在多行中工作,而不是在列表中或在一行中工作(此功能在待办事项列表中供以后考虑)。您可以在这里使用更复杂的Cypher reduce()函数,但这种方法更具可读性。您可以在这里使用一个案例来选择两者中的最小值和最大值,这可能是最简单的非APOC方法。在我的回答中补充了这一点。
MATCH (n)
UNWIND [n.start_t, n.end_t, n.begin, n.end] as l
WITH min(l) as min, max(l) as max
MATCH ()-[e]->()
UNWIND [e.start_t, e.end_t, e.begin, e.end] as l
WITH min, max, min(l) as minR, max(l) as maxR
RETURN CASE WHEN min < minR THEN min ELSE minR END as min, CASE WHEN max > maxR THEN max ELSE maxR END as max