2017-01-31 10 views
0

私は単純な問題を解決しようとしています。ユーザーの類似度を、製品の評価のために計算されたユークリッド距離に基づいて計算します。OrientDB - 類似度を計算する

私は今、各ペア(ユーザU1、ユーザU2)のための共通の製品の評価との間の距離を表す結果を計算することになるようなクエリを

SELECT U1.UserId, U2.UserId 
FROM (
    MATCH 
    {class:User, as: U1, where: (UserId=12345) } -rate-> {class:Product, as:P}, 
    {class:User, as: U2, where: (UserId<>12345)} -rate-> {as:OP}, 
    RETURN U1, U2, P, OP 
) 

を使用しています。

ユーザー

U1,Product,Rating 
1, xxx, 5 
2, xxx, 2 
1, yyy, 10 
2, yyy, 8 

のための一般的な製品の例だから私はSQRT((5-2)^ 2 +(10-8)^ 2)の距離として

が持つ可能性これはを計算しますOrientDBに対する単一の問合せ。 Neo4Jは、Cypher Queryで連続したインスタンスを操作するためのWITH文を提供します。

私たちにご提供いただけるすべてのご支援に感謝します。私は2人のユーザーや製品の評価の距離を返すためにMATCH文を書き換えたいすべての

Thxを ロベルト

答えて

0

まず:

MATCH 
    {class:User, as: U1, where: (UserId=12345) }.outE("rate"){as:r1}.inV(){class:Product, as:P}, 
    {class:User, as: U2, where: (UserId<>12345)}.outE("rate"){as:r2}.inV(){as:P}, 
RETURN U1, U2, (r1.rating - r2.rating) * (r1.rating - r2.rating) as squareDistance, P 

次にあなたがするいくつかの外側のSELECTを使用することができます計算:

SELECT U1, U2, P, sqrt(squareSum) as distance from (
    SELECT U1, U2, P, sum(squareDistance) as squareSum from (
    MATCH... 
) GROUP BY U1, U2, P 
) 

ここでの唯一の問題は、あなたがあなた自身のSQRを記述する必要がありのでOrientDBは、ビルトインのsqrt()関数を持っていないということですt()をjavascriptで使用します。内部のjs関数はJavaクラスを使用できるので、関数本体はちょうど

return java.lang.Math.sqrt(x); 
+0

こんにちはルイージ、ありがとう。クエリの最後に新しいエッジを割り当てることは可能ですか?計算された類似度を表すでしょうか? –

関連する問題