Tengo el siguiente cifrado que funciona correctamente en el navegador Neo4j y devuelve todas las entidades relacionadas como se esperaba:

MATCH (cmp:Competition)-[:COMPETITION_COUNTRY]-(cc:Country)
WHERE ID(cmp)=16860

MATCH (cmp)-[:COMPETITION]-(s:Season)<-[:SEASON]-(f:Fixture)
WHERE s.yearStart=2019

MATCH (f)-[:HOME_TEAM]-(ht:Team)-[:TEAM_COUNTRY]-(htc:Country)
MATCH (f)-[:HOME_TEAM]-(at:Team)-[:TEAM_COUNTRY]-(atc:Country)

RETURN cmp, s, f, ht, at, htc, atc
ORDER BY f.matchDate DESC, ht.name DESC

Y tengo esto como una función Neo4jRepository de la siguiente manera:

@Query("MATCH (cmp:Competition)-[:COMPETITION_COUNTRY]-(cc:Country)\n" +
        "WHERE ID(cmp)={0}\n" +
        "\n" +
        "MATCH (cmp)-[:COMPETITION]-(s:Season)<-[:SEASON]-(f:Fixture)\n" +
        "WHERE s.yearStart={1}\n" +
        "\n" +
        "MATCH (f)-[:HOME_TEAM]-(ht:Team)-[:TEAM_COUNTRY]-(htc:Country)\n" +
        "MATCH (f)-[:HOME_TEAM]-(at:Team)-[:TEAM_COUNTRY]-(atc:Country)\n" +
        "\n" +
        "RETURN cmp, s, f, ht, at, htc, atc\n" +
        "ORDER BY f.matchDate DESC, ht.name DESC"
)
List<Fixture> getCompetitionYearFixtures(
         Long competitionId, Integer yearStart
);

Llamo a este método de la siguiente manera:

List<Fixture> fixtures =
        fixtureRepository
                .getCompetitionYearFixtures(
                        competitionId, year);

Aunque se devuelven todos los Fixture esperados, no se completa ninguna de las entidades relacionadas: Accesorios despoblados

Sin embargo, descubrí que si ejecuto inmediatamente la siguiente declaración para cualquiera (y solo uno) de los Fxture devueltos, entonces cada Fixture en fixture s de repente se completa por completo:

fixtureRepository.findOne(fixtures.get(0).getId(), 3);

Como tal: Accesorios poblados

Entonces, mi pregunta es, ¿hay alguna manera de devolver los Fixture s con todas las entidades relacionadas pobladas después del primer viaje a la base de datos, sin tener que regresar?

Recuperé específicamente todo lo que necesitaba en Cypher, y la idea de usar un depth de 3 en findOne es algo con lo que me siento un poco incómodo, ya que en el futuro puedo agregar nuevas relaciones que gané No necesariamente quiero hinchar la consulta.


EDITAR Solución, gracias a František Hartman:

MATCH r1=(cmp:Competition)-[cmp_c:COMPETITION_COUNTRY]-(cmpc:Country)
WHERE ID(cmp)=16860
MATCH r2=(cmp)-[cmp_s:COMPETITION]-(s:Season)<-[s_f:SEASON]-(f:Fixture)
WHERE s.yearStart=2019
MATCH r3=(f)-[f_ht:HOME_TEAM]-(ht:Team)-[ht_c:TEAM_COUNTRY]-(htc:Country)
MATCH r4=(f)-[f_at:AWAY_TEAM]-(at:Team)-[at_c:TEAM_COUNTRY]-(atc:Country)
RETURN r1,r2,r3,r4
ORDER BY f.matchDate DESC,ht.name DESC
0
Niall 13 oct. 2019 a las 17:40

1 respuesta

La mejor respuesta

Debe devolver todo lo que desea mapear, en su caso, espera que las relaciones también se mapeen (incluso si no tiene entidades de relación, la relación dice, por ejemplo, que el accesorio y el equipo local están relacionados).

Para ver qué se devuelve exactamente en su navegador Neo4j, vaya a "Configuración del navegador" (icono de engranaje en la parte inferior izquierda) -> Desmarque "Conectar nodos de resultados"

Consulta con las relaciones (es posible que pueda encontrar mejores nombres que r1-r7):

MATCH (cmp:Competition)-[r1:COMPETITION_COUNTRY]-(cc:Country)
WHERE ID(cmp)=16860

MATCH (cmp)-[r2:COMPETITION]-(s:Season)<-[r3:SEASON]-(f:Fixture)
WHERE s.yearStart=2019

MATCH (f)-[r4:HOME_TEAM]-(ht:Team)-[r5:TEAM_COUNTRY]-(htc:Country)
MATCH (f)-[r6:HOME_TEAM]-(at:Team)-[r7:TEAM_COUNTRY]-(atc:Country)

RETURN cmp, s, f, ht, at, htc, atc, r1, r2, r3, r4, r5, r6, r7
ORDER BY f.matchDate DESC, ht.name DESC

El método findOne (con el parámetro de profundidad 3) carga todo, incluidas las relaciones hasta 3 pasos, que se completarán en instancias almacenadas en caché de sus datos.

1
František Hartman 14 oct. 2019 a las 08:51