2016-02-11 5 views
0

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

У меня есть 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 по Id:

membershipRepository.findByMembershipId(id); 

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

EDIT: Я прочитал в 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); 

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

ответ

1

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

Пример:

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

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

Но если вы не хотите загружать членство с глубиной 2, потому что слишком большая часть вашего графика будет загружена (из других отношений), тогда я думаю, что вы могли бы построить запрос cypher (используя OPTIONAL MATCH), выполнить его с помощью neo4jTemplate и получить объект, который будет автоматически lly отображается из-за «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); 

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

Смежные вопросы