Я новичок в Neo4j с фоном mysql, я пытаюсь преобразовать старую систему галереи изображений mysql в графическую базу данных Neo4j, схема, с которой я приехал, представлена на графике ниже:
_ Есть пользовательские узлы с типами отношения буксировки:
- Опубликовано:
(:User)-[:POSTED]->(:Post)
- Имеет аватар:
(:User)-[:HAS_AVATAR]->(:Image)
_ Опубликовать узлы с типами отношений буксировки:
- Имеет дочерний элемент для родительского сообщения галереи:
(:Post)-[:HAS_CHILD]->(:Post)
- Имеет изображение для галереидочерние сообщения:
(:Post)-[:HAS_IMAGE]->(:Image)
_ конечные узлы изображения.
Это упрощенная версия, фактически каждый пост (родитель и ребенок) может иметь ссылку или видео вместоизображение и может быть прокомментировано или понравилось пользователям.
Чтобы получить все данные, которые мне нужны из графика, я использую этот шифровый запрос:
MATCH (p:Post)<-[:POSTED]-(u:User) WHERE NOT (p)<-[:HAS_CHILD]-(:Post)
MATCH (u)-[:HAS_AVATAR]->(ua:Image)
OPTIONAL MATCH (p)-[:HAS_CHILD]->(c:Post)
OPTIONAL MATCH (p)-[:HAS_IMAGE]-(i:Image)
OPTIONAL MATCH (c)-[:HAS_IMAGE]-(ci:Image)
RETURN
[p._id, [u.username, ua._id], i._id, c._id, ci._id] as post
В итоге получаетсярезультат, подобный этому:
Опять же, я держу этот запрос простым, для ясности,у каждого изображения есть идентификатор, ширина и высота, у каждого дочернего поста может быть свой пользователь, отличный от своего родителя, и у каждого поста есть свои комментарии и лайки от разных пользователей, реальный результат намного больше, чем этот.
Прямо сейчас мне приходится иметь дело со многими lodash/union
, чтобы избавиться от всех повторяющихся результатов (идентификаторы сообщений, имена пользователей ...)
У меня вопрос, правильно ли я делаю?Есть ли лучший подход?Я на самом деле читаю о MERGE
и плохо пытаюсь его реализовать.
Так что я обращаюсь к вам, ребята, и к вашим экспертам за любыми советами, особенно если он может получить все функции объединения внутри шифразапрос.
Спасибо.