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,我必须将同一对节点和SUM()之间的两个不同关系上的属性相乘,然后根据值对这些对进行排序。 例: 现在,, 1) 每个节点b、c、d都有两个与X、Y的关系,这两个关系是相乘和成对相加的 2) 返回最大值 我试图解决这个问题: WITH [b,c,d] AS words MATCH (i:amps) MATCH n where n.word in words MATCH

我必须将同一对节点和SUM()之间的两个不同关系上的属性相乘,然后根据值对这些对进行排序。 例:

现在,, 1) 每个节点b、c、d都有两个与X、Y的关系,这两个关系是相乘和成对相加的 2) 返回最大值

我试图解决这个问题:

WITH [b,c,d] AS words                                                                
MATCH (i:amps) 
MATCH n where n.word in words
MATCH p=(i-[r:jaccard]->(n)) with i,r.dist as dist UNWIND dist as distances
MATCH q=(i-[s:coocr]->(n)) with distances,i,s.val as co UNWIND co as coocr
WITH i, SUM(distances*coocr) AS agg
RETURN i,agg ORDER BY agg DESC
我的加积门功能的工作方式如下:

X-[]->b has[jaccard,coocr] , so, jacc.dist*coocr.val = 1*2 =2
X-[]->c has[jaccard,coocr] , so, jacc.dist*coocr.val = 2*3 =6
X-[]->d has[jaccard,] , so, jacc.dist*null = null*2 =0
                                                    --------------
                                                      sum  = 8
                                                    --------------

Y-[]->b has[jaccard,coocr] , so, jacc.dist*coocr.val = 4*2 =8
Y-[]->c has[jaccard,coocr] , so, jacc.dist*coocr.val = 1*3 =3
Y-[]->d has[jaccard,coocr] , so, jacc.dist*coocr.val = 4*4 =16
                                                    --------------
                                                      sum  = 27
                                                    --------------
然后有序地返回这些集合

我的查询返回的是聚合,它们只是乘积,而不是全部总和。 需要达到谁的总和。

这个呢

MATCH (a:amps)
OPTIONAL MATCH (a)-[coocr:coocr]-(n)
OPTIONAL MATCH (a)-[jacc:jacc]-(n)
WITH a, COALESCE(coocr.val, 0) AS val, COALESCE(jacc.dist, 0) AS dist
RETURN a, SUM(val * dist) AS agg
ORDER BY agg DESC

聚合函数,在最后一行解决了这个问题。谢谢你的建议。

我不太明白你想计算什么。关于上述数据集的预期结果是什么?将更新与可选匹配无关的问题。问题是聚合a的所有n个关系值(coocr*jacc)。聚合发生在每个节点
a
。如果没有这种关系,可选匹配只返回nul valuesl是的,如果没有关系(如
X
d
之间的情况),则
可选匹配
返回
NULL
COALESCE
从它的参数中给出第一个非空值,因此如果没有关系,它将默认为
0
。正如Michael所说,它应该通过
a
进行聚合,因为在Cypher中,任何带有非聚合函数的
RETURN
列都被用作分组值,这一点非常有用。但是你的建议稍微延长一下就解决了我的问题。我会把我的答案贴在下面。谢谢你,布莱恩。。
MATCH (a:amps)
OPTIONAL MATCH (a)-[coocr:coocr]-(n)
OPTIONAL MATCH (a)-[jacc:jacc]-(n)
WITH a, COALESCE(coocr.val, 0) AS val, COALESCE(jacc.dist, 0) AS dist
RETURN a, SUM(val * dist) AS agg
ORDER BY agg DESC
WITH ["best", "high", "quality","4k"] AS words                                                                
MATCH (i:amps) 
MATCH n where n.word in words
OPTIONAL MATCH p=(i-[r:jaccard]->(n)) with n,i,COALESCE(r.dist, 0)  as distances
OPTIONAL MATCH q=(i-[s:coocr]->(n)) with distances,n,i,COALESCE(s.val, 0) AS  coocr
WITH i,n,distances,coocr, (distances*coocr) AS agg
WITH i,SUM(agg) AS agg
RETURN i,agg