Neo4j with Spring - лучший дизайн репозитория
В настоящее время я работаю над проектом на основе данных Spring Neo4j. Здесь, в большинстве узлов, может быть несколько типов различных отношений, как показано в примере ниже.
Определение узла
@NodeEntity(label = CollectionNames.User)
public class User{
@GraphId
private Long id;
//Different Parameters, removed because these are irrelevant
@Relationship(type = RelationshipNames.HAS_CONTACT, direction = Relationship.OUTGOING)
private Set<HasContact> contactList;
@Relationship(type = RelationshipNames.HAS_INVITED, direction = Relationship.OUTGOING)
private Set<HasInvited> invitedContacts;
@Relationship(type = RelationshipNames.HAS_FAVORITE, direction = Relationship.OUTGOING)
private Set<HasFavorite> favoriteMerchants;
//And so many others such relationships
//Constructor and Getters() & Setters()
}
Определение хранилища
@Repository
public interface UserRepository extends GraphRepository<User>{
List<User> findByUsernameIn(Set<String> username, @Depth int depth);//Here for exp, I just want to load user with his/her 'contactList' entries only
User findByUsername(String username, @Depth int depth);
}
Хотя этот репозиторий работает нормально при загрузке данного пользователя с заданной глубиной, но основная проблема заключается в том, что этот запрос будет загружать все существующие отношения с заданной глубиной. Как здесь, я просто интересуюсь некоторыми / или только одним конкретным типом отношений, так как это может быть возможно с помощью методов Spring Named Query? Можно ли указать глубину для каждого отношения при загрузке с использованием методов именованных запросов? Или я должен написать собственный запрос для каждого такого отношения, используя аннотацию @Query? Мы хотим минимизировать использование пользовательских запросов!
Так что же является лучшим дизайном репозитория в Spring Data Neo4j для таких случаев? Предложение будет высоко оценено!
1 ответ
Начиная с версии SDN 4.2.x пользовательский запрос на шифрование в @Query
или с помощью session.query
это лучший вариант, если вы хотите избежать загрузки всех связанных объектов.
Работа над более мелкозернистой загрузкой ведется в следующем выпуске. Смотрите этот вопрос GitHu b.