=== Редактировать ======
Ваша проблема возникает из-за того, что у вас есть собственные отношения (отношения между узлами одной метки)
ЭтоВот как Spring обрабатывает ваш запрос для одного узла:
org.springframework.data.neo4j.repository.query.GraphQueryExecution
@Override
public Object execute(Query query, Class<?> type) {
Iterable<?> result;
....
Object ret = iterator.next();
if (iterator.hasNext()) {
throw new IncorrectResultSizeDataAccessException("Incorrect result size: expected at most 1", 1);
}
return ret;
}
Spring передает тип класса вашего узла Class<?> type
в neo4j-ogm и считывает ваши данные обратно.
Знаете, сервер neo4j будет возвращать несколько строк для вашего запроса, по одной для каждого соответствующего path
:
A <- PARENT - B
A <- PARENT - C
A <- PARENT - D
Если ваши узлы имеют разные метки, то есть имеют другой тип класса, тогда ogmтолько один возвращаемый узел соответствует вашему типу возврата запроса, нет проблем.
Но ваши узлы имеют одинаковые метки, то есть один и тот же тип класса => Neo4j OGM не может различить, который является возвращенным узлом -> Все узлы A,B, C, D возвращено -> Исключение
В связи с этой проблемой, я думаю, вам следует подать отчет об ошибке сейчас.
В качестве обходного пути вы можете изменить запрос, чтобы он возвращал только distinct target.your_identity_property
(identity_property
- это «первичный ключ» узла, который уникальноидентифицируйте свой узел)
Затем загрузите вызов приложения с этим свойством идентичности:
public interface BoardRepository extends CrudRepository<BoardPos, Long> {
@Query("MATCH (target:B) <-[c:PARENT]- (child:B) WHERE target.play={Play} RETURN DISTINCT target.your_identity_property")
Long findActiveByPlay(@Param("Play") String play);
BoardPos findByYourIdentityProperty(xxxx);
}
=== OLD ======
Spring docs говорит, что (выделено мной):
Пользовательские запросы не поддерживают настраиваемую глубину.Кроме того, @Query не поддерживает отображение пути к объектам домена, поэтому путь не должен возвращаться из запроса Cypher. Вместо этого возвращайте узлы и отношения, чтобы сопоставить их с сущностями домена.
Итак, ваш вариант использования (заполнение дочерних узлов пользовательским запросом) поддерживается .Spring Framework уже отображает результаты в один узел.(Действительно, мои настройки локальных явок показывают, что операция работает нормально)
Таким образом, ваше исключение может быть вызвано несколькими проблемами:
У вас более одного target:BoardPosition
с target.play={play}
.Таким образом, исключение относится к более чем одному target:BoardPosition
вместо одного BoardPosition с несколькими дочерними результатами
У вас неверное сопоставление сущностей.У вас есть поле сопоставления, помеченное @Relationship
с правильным атрибутом direction
?Вы можете опубликовать свою сущность здесь.
Вот мои локальные настройки:
@NodeEntity(label = "C")
@Data
public class Child {
@Id
@GeneratedValue
private long id;
private String name;
@Relationship(type = "PARENT", direction = "INCOMING")
private List<Parent> parents;
}
public interface ChildRepository extends CrudRepository<Child, Long> {
@Query("MATCH (target:C) <-[p:PARENT]- (child:P) "
+ "WHERE target.name={name} "
+ "RETURN target, p, child")
Child findByName(@Param("name") String name);
}
(:C) <-[:PARENT] - (:P)