2015-11-08 72 views
1

的之间的不同关系我不得不上基于相同的一对节点和SUM()它,然后ORDER之间的两个不同的关系BY的对相乘的属性集合值值。 例:的Neo4j - 需要在同一节点对

Let (X:amps)-[:coocr{val:1}]->b 
    (X:amps)-[:jacc{dist:2}]->b 
    (X:amps)-[:coocr{val:2}]->c 
    (X:amps)-[:jacc{dist:3}]->c 
    (X:amps)-[:coocr]->d 
    (X:amps)-[:jacc{dist:4}]->d 
    (Y:amps)-[:coocr{val:2}]->b 
    (Y:amps)-[:jacc{dist:3}]->b 
    (Y:amps)-[:coocr{val:1}]->c 
    (Y:amps)-[:jacc{dist:4}]->c 
    (Y:amps)-[:coocr{val:4}]->d 
    (Y:amps)-[:jacc{dist:3}]->d 

现在, 1)中的每个节点B,C,d具有与X 2间的关系,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 

我aggragate功能都有工作,如:

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 
                -------------- 

然后按顺序返回这些聚合。

我的查询返回的只是产品的总量,而不是全部总和。 需要实现其总和。

+0

不太明白你想要计算什么。上述数据集的预期结果是什么? –

+0

将更新问题 –

回答

2

这是怎么回事?

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 
+0

请您详细说明逻辑。这有点棘手。 –

+0

不涉及可选匹配。问题汇总了a的所有n个关系值(coocr * jacc)。 –

+0

聚合发生在每个节点'a'。如果没有这种关系,那么可选匹配只返回nul valuesl。 –

0
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 

聚集功能,在倒数第二个行解决了这个问题。感谢Brain的建议。