2015-11-08 73 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的建議。