2017-02-02 2 views
0

Я пытаюсь сделать структуру каталогов с Neo4j и Spring Data (spring-data-neo4j 4.2.0.RELEASE).Как указать глубину в запросах с данными Spring Neo4j?

У меня есть компонент каталога:

@NodeEntity 
public class Directory { 
    @GraphId private Long id; 
    private String name; 

    @Relationship(type = "HAS_CHILD_CONTENT", direction = Relationship.OUTGOING) 
    public Set<Directory> subDirectories; 

    public void hasChildContent(Directory subDir) { 
     if (subDirectories == null) { 
      subDirectories = new HashSet<>(); 
     } 
    subDirectories.add(subDir); 
} 

и мой Repository:

public interface DirectoryRepository extends GraphRepository<Directory> { 
    @Query("MATCH (a:Directory) WHERE NOT()-[:HAS_CHILD_CONTENT]->(a) RETURN a ORDER BY a.name ASC") 
    List<Directory> findAllRoots(); 

    Directory findOneByName(String name, @Depth int depth); 
} 

Моя проблема в том, что каталог содержит список его подкаталогов, и я не хочу, чтобы принести все каталоги в базе данных, когда я получаю корневой каталог.

На данный момент, если я создаю эту выборку данных:

Directory root = new Directory("root"); 
Directory rootLevel1 = new Directory("rootLevel1"); 
Directory rootLevel2 = new Directory("rootLevel2"); 
root.hasChildContent(rootLevel1); 
rootLevel1.hasChildContent(rootLevel2); 
directoryRepository.save(root); 

И выберите корневые узлы:

directoryRepository.findAllRoots(); 

я получаю корневой каталог, имея rootLevel1 как подкаталог которого имеет rootLevel2 как subDir.

Я хочу получить только корень, имеющий rootLevel1, имеющий нуль (как subDir). Поэтому я не извлекаю все каталоги DB.

Я попытался Пары @Depth, но вызов:

directoryRepository.findOneByName("root", 0); 

извлекает корневую директорию, имея rootLevel1 как подкаталог которого имеет rootLevel2 как подкаталог. Как будто глубина не была учтена.

Как я могу выбрать узел только с его подкаталогами, но не с подкаталогами подкаталогов подкаталогов ...?

Спасибо.

[EDIT]

Я обнаружил, что удаление транзакционной аннотации на моем интеграционный тесте влияет на систему fecthing из SDN.

С помощью аннотации Transactional SDN с нетерпением ищет все подкаталоги и загружает всю структуру каталогов из Neo4J.

Без аннотации Transactional, SDN, установленный лениво, и мой компонент Directory имеет null как атрибут subDirectories.

Это решает мою проблему, но не отвечает на вопрос: как настроить пользовательскую глубину для извлечения.

+0

Кажется, что это ошибка в SDN/OGM. Может быть связано с https://github.com/neo4j/neo4j-ogm/issues/324. Не могли бы вы отправить вопрос, пожалуйста? – nmervaillie

+0

@nmervaillie На самом деле у меня странная «ошибка». С самого начала я имел аннотацию Transactional на тестовом классе. Но если я удалю его, у Iall Directory beans нет никаких подкаталогов. Таким образом, Transactional SDN рекурсивно решает все отношения, без Transactional SDN ленив и никаких отношений не извлекается. –

ответ

2

Это, вероятно, потому, что вы одни и те же основной сессии для вас писать и читать ваш.

Когда вы читаете сущности, SDN/OGM обнаруживает, что они уже находятся в сеансе (на основе идентификатора). Он возвращает их, поскольку они находятся на сессии, полностью заполненные.

Когда вы удаляете @Transactional, каждый доступ к db выполняется в новом новом сеансе, что дает ожидаемый результат.

Если вам нужно по какой-либо причине читать сразу после записи, вам может понадобиться ввести сеанс OGM для вызова session.clear(), чтобы принудительно обновить сеанс.

+0

Вы правы, он работает с аннотацией Transactional и session.clear() juste после кода инициализации. Благодаря ! –

0

Вы могли бы рассмотреть

MATCH p=(n:Directory)-[]-m where length(p)=1 return m limit 25 

или

match p=(n)-[]-(m) with m, reduce(status ='', q IN nodes(p)| status + 'x') AS c where length(c)=1 return m, c 
+0

Спасибо за ответ. Но он не делает то, что я хочу. Я думаю, что проблема заключается в «извлечении», выполняемом SDN4, поскольку мне нужны корневые каталоги, но не их дети. Таким образом, я хочу получить пустой атрибут subDirectories после того, как запрос был извлечен. –

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