Граф или реляционная база данных лучше для этой древовидной структуры? - PullRequest
3 голосов
/ 01 апреля 2019

Я новичок в графических базах данных и мне нужна рекомендация для этого сценария.У меня есть люди, которым нравятся категории (только листья на дереве), остальные узлы (родители) не получают "лайки".Затем я вычисляю оценку для всех подключений определенного пользователя к другим пользователям.Это графический пример:

enter image description here

Я пытаюсь с 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 лайков каждому.Я слушаю любое мнение, спасибо!

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