Я новичок в графических базах данных и мне нужна рекомендация для этого сценария.У меня есть люди, которым нравятся категории (только листья на дереве), остальные узлы (родители) не получают "лайки".Затем я вычисляю оценку для всех подключений определенного пользователя к другим пользователям.Это графический пример:
Я пытаюсь с neo4j, и у меня нет проблем (очень маленький набор данных), но я боюсь производительностис большим количеством пользователей.Я протестировал следующий запрос:
MATCH (n:Person)-[:LIKES*]->()-[r:SUB*0..4]-()<-[:LIKES*]-(m:Person)
WHERE n.name='Gabriel' and n<>m
WITH n.name as user, m.name as connection, 1.0/(length(r)+1)*count(r) as score
RETURN user, connection, sum(score)
Я также думал о том, чтобы сделать это в реляционной базе данных, сохранить 3 поля для лайков категории (cat1, cat2, cat3), а затем сделать 3 самостоятельных соединения, просматриваядля матчей в разных уровнях категории.Примерно так (начиная с пользователя 1 и пытаясь сопоставить его с другими):
select l2.user_id, sum(
case
when (l1.cat2 = l2.cat2 and l1.cat3 = l2.cat3) then 1
when (l1.cat2 = l2.cat2) then 0.25
else 0.05
end)
from likes l1
inner join likes l2 on l1.cat1 = l2.cat1 and l2.user_id <> 1
where l1.user_id = 1
group by l2.user_id
, но я также читал, что вам следует избегать самостоятельных объединений.
Я уточняю, что ищупроизводительность чтения, запись не имеет значения.Моя цель состоит в том, чтобы он хорошо работал с 1 миллионом пользователей по 10 лайков каждому.Я слушаю любое мнение, спасибо!