Как получить объекты прямой связи и непосредственно связанные узлы в пользовательском запросе в SDN4?

У меня есть аннотированный метод поиска в моем хранилище:

@Query("MATCH (me:User)<-[ab:ASKED_BY]-(q:Question) WHERE id(me) = {0} RETURN q")
Iterable<Question> findQuestionsByUserId(Long id);

Мои объекты, такие как:

@NodeEntity
public class Question {
    private AskedBy askedBy;

    @Relationship(type = "TAGGED_WITH")
    private Set<Tag> tags = new HashSet<>();
//...
}

@RelationshipEntity(type = "ASKED_BY")
public class AskedBy {
    @GraphId private Long id;

    @StartNode
    private User user;

    @EndNode
    private Question question;

    // other props
}

Когда я вызываю метод репозитория, askedBy поле null в результате. Как я могу заполнить это поле отношениями?

Обновить:

Я попытался загрузить отношения с сеансом loadAll (коллекция), но это не помогло.

    final Collection<Question> questions = (Collection<Question>) questionRepository.findQuestionsByUserId(user.getId());
    final Question q = questions.iterator().next();
    System.out.println("After `findQuestionsByUserId`:");
    System.out.println("`q.getTags().size()`: " + q.getTags().size());
    System.out.println("`q.getAskedBy()`: " + q.getAskedBy());
    neo4jOperations.loadAll(questions, 1);
    System.out.println("After `neo4jOperations.loadAll(questions, 1)`:");
    System.out.println("`q.getTags().size()`: " + q.getTags().size());
    System.out.println("`q.getAskedBy()`: " + q.getAskedBy());
    final Collection<AskedBy> askedByCollection = neo4jOperations.loadAll(AskedBy.class);
    System.out.println("`askedByCollection.size()`: " + askedByCollection.size());

Вышеуказанные выводы

После findQuestionsByUserId:
q.getTags().size(): 0
q.getAskedBy(): ноль
После neo4jOperations.loadAll(questions, 1):
q.getTags().size(): 1
q.getAskedBy(): ноль
askedByCollection.size(): 0

Таким образом, кажется, что для пользовательского запроса глубина по умолчанию равна 0, и по какой-то неизвестной причине я не могу загрузить объект отношения.

График выглядит хорошо: график

1 ответ

Решение

На данный момент пользовательские запросы не поддерживают параметр глубины (он есть в дорожной карте), поэтому у вас есть следующие опции:

а) использовать repository.findOne(userId) (по умолчанию это глубина 1, поэтому он должен загрузить AskedBy). Или настройте глубину с repository.findOne(userId,depth), Или использовать Neo4jTemplate.load(type,id,depth)

б) Если вам нужно запросить больше, чем идентификатор, используйте loadAll методы на org.neo4j.ogm.session.Session которые принимают набор org.neo4j.ogm.cypher.Filter, Примеры, доступные в MusicIntegrationTest

c) Продолжите с пользовательским запросом, но после того, как вы получите обратно идентификатор объекта, загрузите его через load* методы, обеспечивающие пользовательскую глубину.

Другие вопросы по тегам