findByPropertyAndReleation не дает мне ожидаемый объект - PullRequest
0 голосов
/ 24 июня 2019

Я импортирую исторические данные о футболе (или футболе, если вы из США) в базу данных 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 из коробки.

Любая помощь приветствуется.Дайте мне знать, если вам нужно больше деталей.

1 Ответ

1 голос
/ 25 июня 2019

Spring Data Neo4j на данный момент не поддерживает объекты в качестве параметров. Можно запрашивать свойства в связанных объектах / узлах, например, findBySeasonNumberAndLeagueName если это подходящее решение.

...