2017-01-31 6 views
0

Я пытаюсь решить простую задачу: вычислить подобие пользователя к пользователю на основе эвклидовой дистанции, рассчитанной для оценок продукта.OrientDB - Compute User Similarity

Я использую такой запрос

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, пользователь U2) результат, который представляет собой расстояние между оценкой для общего продукта.

Пример общих продуктов для пользователей

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

Так что я бы вычислить SQRT ((5-2)^2 + (10-8)^2), а расстояние

Возможно ли это с один запрос на OrientDB. Neo4J предоставляет оператор WITH для управления последовательным экземпляром в Cypher Query.

Большое спасибо за помощь, которую вы можете нам предоставить.

Thx Роберто

ответ

0

Прежде всего, я бы переписать заявление MATCH, чтобы вернуть расстояние оценки для двух пользователей и продукт:

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 U1, U2, P, sqrt(squareSum) as distance from (
    SELECT U1, U2, P, sum(squareDistance) as squareSum from (
    MATCH... 
) GROUP BY U1, U2, P 
) 

Единственная проблема здесь состоит в том, что OrientDB не имеет встроенную функцию SQRT(), так что вы должны написать свой собственный SQR t() в javascript. Это довольно просто, потому что внутри js-функций вы можете использовать классы Java, поэтому тело функции будет только

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

Hi Luigi, thankyou very much; возможно ли в конце запроса присвоить новый край taht будет представлять вычисленное сходство? –

Смежные вопросы