Как получить объекты прямой связи и непосредственно связанные узлы в пользовательском запросе в 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()
: 0q.getAskedBy()
: ноль
После neo4jOperations.loadAll(questions, 1)
:q.getTags().size()
: 1q.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*
методы, обеспечивающие пользовательскую глубину.