2017-02-20 21 views
0

Сегодня я начал новый проект. У меня есть таблица таблиц таблицы, тегов и края user_tags для результатов графа.Как я могу перечислить пользователей с наиболее похожими данными в ArangoDB

Я приложил к пользователям несколько тегов на графике. Как я могу перечислить пользователей с самыми похожими записями в ArangoDB.

Например:

  • идентификатор пользователя: 112 имеет 3 метки (метки идентификаторы: 50, 51, 52, 53)
  • идентификатор пользователя: 113 имеет 5 метки (метки идентификаторы: 52, 53, 54, 55, 56)
  • идентификатор пользователя: 114 имеет 4 метки (метки идентификаторы: 51, 52, 53, 54)
  • пользователь ID: 115 имеет 2 метки (метки идентификаторы: 48, 49)

Когда я искал пользователя ID 112 пользователя. Результаты должны быть похож на это:

  1. идентификатор пользователя: 114 (3 матчей, 51, 52, 53)
  2. идентификатор пользователя: 113 (2 матча, 52, 53)

Номера - общие данные не должны входить в результаты ID пользователя: 115

Если никто не знает решение arangodb, я могу использовать neo4j, если есть решение с neo4j.

Спасибо.

ответ

0

В ничтожестве, это вопрос:

MATCH (u1:User {id:114})-[:HAS_TAG]->(tag:Tag), 
     (u:User)-[:HAS_TAG]->(tag:Tag) 
WITH u, collect(id(tag)) AS tags 
RETURN u, tags, size(tags) AS score 
ORDER BY score DESC 

Приветствие

+0

Данные cypher включают текущего пользователя. Поэтому я добавил WHERE u.id <> user_id <- 114 для вашего примера. благодаря! – fourfourtwo

0

В ArangoDB, этот запрос будет работать, так долго, как вы создаете граф с users и tags как наборы вершин и user_tags, как ваш краевой сбор:

LET active_user = FIRST(
    FOR u IN users 
    FILTER u.id == @user_id 
    RETURN u._id 
) 

LET active_tags = (
    FOR v IN 1..10 OUTBOUND active_user GRAPH 'user_tags_graph' 
    RETURN (v.id) 
) 

FOR u IN users 
FILTER u._id != active_user 
    LET tags_in_use = FLATTEN(
     FOR v IN 1..10 OUTBOUND u._id GRAPH 'user_tags_graph' 
     RETURN [v.id] 
    ) 
    LET tag_matches = (
     RETURN LENGTH(INTERSECTION(active_tags, tags_in_use)) 
    ) 
    FILTER FIRST(tag_matches) > 0 
    SORT tag_matches DESC 
    RETURN { 
     [u.id]: INTERSECTION(active_tags, tags_in_use) 
    } 

Возможно, он может быть оптимизирован в значительной степени, но его устранение, как это сделало его проще понимать.