Отношения выборки данных Spring Neo4j

Я использую spring-data-neo4j V4 и ищу решение, как извлекать объекты, которые не связаны напрямую с загруженным объектом. Объяснить:

У меня есть 3 объекта в моей базе данных neo4j.

@NodeEntity(label="membership")
public class Membership extends AbstractEntity{

    public Membership(){ }

    private String membershipId;

    @Relationship(type = "IN_YEAR", direction = Relationship.OUTGOING)
    private Set<Year> year = new HashSet<>();

    //getter+setter

}

@NodeEntity(label="year")
public class Year extends AbstractEntity{

    public Year(){}

    private String name;
    private String membershipId;

    @Relationship(type = "IN_MONTH", direction = Relationship.OUTGOING )
    private Set<Month> month = new HashSet<>();

    //getter+setter
}

@NodeEntity(label="month")
public class Month extends AbstractEntity{

    private String name;

    //getter+setter
}

Когда я вызываю свой MembershipRepository и загружаю Membership по идентификатору:

membershipRepository.findByMembershipId(id);

объекты year будут извлечены, а объекты month — нет. Может ли кто-нибудь сказать, что является лучшим или рекомендуемым способом загрузки объектов month при загрузке объекта membership? Как написано в http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/ @Fetch устарел с версии 4, поэтому мне нужно другое решение.

РЕДАКТИРОВАТЬ: я прочитал в http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/ обходной путь для выборки, просто используйте load методы из файла Neo4jTemplate. Итак, я загружаю месяцы для каждого года:

Set<Year> fetchedYear = new HashSet<>();
for(Year year : ms.getYear()){
    fetchedYear.add(neo4jTemplate.load(Year.class, year.getId(), 1));
}   
ms.setYear(fetchedYear);

Но есть ли лучшее решение?


person K.E.    schedule 11.02.2016    source источник


Ответы (1)


Первый вариант — использовать loadByProperty и установить глубину загрузки на 2.

Пример:

neo4jTemplate.loadByProperty(Membership.class, "membershipId", value, 2);

Это доступно для SDN-4.1.0-Snapshot

Но если вы не хотите загружать членство с глубиной 2, потому что слишком большая часть вашего графика будет загружена (из других отношений), то я думаю, вы могли бы создать шифрованный запрос (используя ДОПОЛНИТЕЛЬНОЕ СОВПАДЕНИЕ), выполнить его с помощью neo4jTemplate и получить Объект, который затем будет автоматически сопоставлен благодаря «smartObjectMapping».

Пример:

String query = "MATCH (n:Membership{membershipId:{id})-[r]-(m) OPTIONAL MATCH (m:Year)-[e]-(x) RETURN n,r,m,e,x";
Map<String,Object> map = new HashMap<>();
map.put("id",value);
Result result = neo4jTemplate.query(query,map);

теперь n в Результате должен содержать все сопоставленные отношения

person fkorn    schedule 11.02.2016