Я пытаюсь сделать структуру каталогов с 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.
Это решает мою проблему, но не отвечает на вопрос: как настроить пользовательскую глубину для извлечения.
Кажется, что это ошибка в SDN/OGM. Может быть связано с https://github.com/neo4j/neo4j-ogm/issues/324. Не могли бы вы отправить вопрос, пожалуйста? – nmervaillie
@nmervaillie На самом деле у меня странная «ошибка». С самого начала я имел аннотацию Transactional на тестовом классе. Но если я удалю его, у Iall Directory beans нет никаких подкаталогов. Таким образом, Transactional SDN рекурсивно решает все отношения, без Transactional SDN ленив и никаких отношений не извлекается. –