Я импортирую исторические данные о футболе (или футболе, если вы из США) в базу данных Neo4j с помощью приложения с загрузочной пружиной (2.1.6.RELEASE) с зависимостью spring-boot-starter-data-neo4j
и автономного локально работающего приложения.3.5.6 Сервер базы данных Neo4j.
Но по какой-то причине поиск сущности с помощью простого свойства и присоединенной сущности, на которую ссылаются, не работает, хотя в базе данных присутствует связь.
Это часть модели, которая в настоящее время вызывает у меня головную боль:
@NodeEntity(label = "Season")
open class Season(
@Id
@GeneratedValue
var id: Long? = null,
@Index(unique = true)
var name: String,
var seasonNumber: Long,
@Relationship(type = "IN_LEAGUE", direction = Relationship.OUTGOING)
var league: League?,
var start: LocalDate,
var end: LocalDate
)
@NodeEntity(label = "League")
open class League(
@Id
@GeneratedValue
var id: Long? = null,
@Index(unique = true)
var name: String,
@Relationship(type = "BELONGS_TO", direction = Relationship.OUTGOING)
var country: Country?
)
(я пропустил класс Country, так как я почти уверен, что это не является частью проблемы)
Чтобы разрешить запуск импорта более одного раза, я хочу проверить, присутствует ли соответствующий объект в базе данных, и импортировать только новые.Поэтому я добавил следующий метод SeasonRepository:
open class SeasonRepository : CrudRepository<Season, Long> {
fun findBySeasonNumberAndLeague(number: Long, league: League): Season?
}
Но он дает мне результат null
вместо существующей сущности при последовательных запусках, поэтому я получаю дубликаты в своей базе данных.
Я ожидал бы, что spring-data-neo4j уменьшит переданный League
до его идентификатора, а затем получит сгенерированный запрос, который выглядит примерно так:
MATCH (s:Season)-[:IN_LEAGUE]->(l:League) WHERE id(l) = {leagueId} AND s.seasonNumber = {seasonNumber} WITH s MATCH (s)-[r]->(o) RETURN s,r,o
, но когда я включаю более точную регистрацию на neo4jПакет Я вижу этот вывод в файле журнала:
MATCH (n:`Season`) WHERE n.`seasonNumber` = { `seasonNumber_0` } AND n.`league` = { `league_1` } WITH n RETURN n,[ [ (n)-[r_i1:`IN_LEAGUE`]->(l1:`League`) | [ r_i1, l1 ] ] ], ID(n) with params {league_1={id=30228, name=1. Bundesliga, country={id=29773, name=Deutschland}}, seasonNumber_0=1}
Так что по некоторым причинам Spring-Data, кажется, думает, что свойство league является простым / примитивным свойством, а не полным выпуском, которое необходимобыть идентифицированным по идентификатору (n.
league = {
league_1 }
).
Я только заставил его работать, передав идентификатор лиги и предоставив пользовательский запрос, используя @Query
аннотации, но я действительно думал, что это будет работать с spring-data-neo4j из коробки.
Любая помощь приветствуется.Дайте мне знать, если вам нужно больше деталей.