Восстановление самой последней лиги в Cypher

У меня есть League узел сущности, как показано ниже

@NodeEntity
class League
{
  private Date startDate;
}

Я хочу вернуть самую последнюю лигу, для которой нижеприведенный шифр работает нормально при запуске из оболочки

START n=node(*) WHERE has(n.__type__) and n.__type__='com.aravind.avl.domain.League' RETURN n ORDER BY n.startDate ASC LIMIT 1

Я переместил это в хранилище, как показано ниже

public interface LeagueRepository extends GraphRepository<League>
{
    @Query ("START n=node(*) RETURN n ORDER BY n.startDate DESC LIMIT 1")
    League findCurrentLeague();
}

Это дает мне ошибку ниже. Я считаю, что нам не нужно предоставлять детали реализации spring-data-neo4j, такие как __type__ при использовании репозиториев. Хотите знать, как правильно написать запрос в хранилище, не раскрывая детали реализации spring-data-neo4j?

JUnit

@Test
    public void findCurrentLeague() throws ParseException
    {
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");

        League l1 = new League();
        l1.setStartDate(df.parse("01/03/2013"));
        l1.setEndDate(new Date());
        l1.setName("in year 2013");

        League l2 = new League();
        l2.setStartDate(df.parse("01/03/2001"));
        l2.setEndDate(df.parse("01/10/2001"));
        l2.setName("in year 2001");

        repo.save(l1);
        repo.save(l2);

        League currentLeague = repo.findCurrentLeague();
        assertNotNull(currentLeague);
        assertEquals("in year 2013", currentLeague.getName());
    }

ошибка

Caused by: org.springframework.dao.InvalidDataAccessResourceUsageException: Error executing statement START n=node(*) RETURN n ORDER BY n.startDate DESC LIMIT 1; nested exception is org.neo4j.cypher.EntityNotFoundException: The property 'startDate' does not exist on Node[0]
    at org.springframework.data.neo4j.support.query.CypherQueryEngine.parseAndExecuteQuery(CypherQueryEngine.java:63)
    at org.springframework.data.neo4j.support.query.CypherQueryEngine.query(CypherQueryEngine.java:49)
    ... 39 more
Caused by: org.neo4j.cypher.EntityNotFoundException: The property 'startDate' does not exist on Node[0]
    at org.neo4j.cypher.internal.commands.expressions.Property.apply(Property.scala:35)
    at org.neo4j.cypher.internal.commands.expressions.Property.apply(Property.scala:29)
    at org.neo4j.cypher.internal.pipes.ExtractPipe$$anonfun$createResults$1$$anonfun$apply$1.apply(ExtractPipe.scala:37)
    at org.neo4j.cypher.internal.pipes.ExtractPipe$$anonfun$createResults$1$$anonfun$apply$1.apply(ExtractPipe.scala:35)
    at scala.collection.immutable.Map$Map1.foreach(Map.scala:118)
    at org.neo4j.cypher.internal.pipes.ExtractPipe$$anonfun$createResults$1.apply(ExtractPipe.scala:35)
    at org.neo4j.cypher.internal.pipes.ExtractPipe$$anonfun$createResults$1.apply(ExtractPipe.scala:34)
    at scala.collection.Iterator$$anon$19.next(Iterator.scala:335)
    at org.neo4j.cypher.internal.pipes.TopPipe.createResults(TopPipe.scala:45)
    at org.neo4j.cypher.internal.pipes.ColumnFilterPipe.createResults(ColumnFilterPipe.scala:37)
    at org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl$$anonfun$6.apply(ExecutionPlanImpl.scala:127)
    at org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl$$anonfun$6.apply(ExecutionPlanImpl.scala:125)
    at org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.execute(ExecutionPlanImpl.scala:33)
    at org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:59)
    at org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:63)
    at org.neo4j.cypher.javacompat.ExecutionEngine.execute(ExecutionEngine.java:79)
    at org.springframework.data.neo4j.support.query.CypherQueryEngine.parseAndExecuteQuery(CypherQueryEngine.java:61)
    ... 40 more
Caused by: org.neo4j.graphdb.NotFoundException: 'startDate' property not found for NodeImpl#0.

2 ответа

Решение

Кроме того, сущности SDN, если они содержат индексированные свойства, должны иметь индексы для них, что позволит вам настроить эти узлы:

START n=node:League("name:*") RETURN n ORDER BY n.startDate? DESC LIMIT 1

НТН

У вас есть свойство startDate на каждом узле? Исключение указывает:

Caused by: org.neo4j.cypher.EntityNotFoundException: The property 'startDate' does not exist on Node[0]
    at org.neo4j.cypher.internal.commands.expressions.Property.apply(Property.scala:35)

и похоже, что он жалуется на ссылочный узел.

Поскольку вы начинаете на всех узлах, используя узел (*), он, вероятно, выбирает опорный узел. Если вам это не нужно, вы можете избавиться от него, или, если у вас все равно нет startDate на всех узлах, можете изменить свой запрос на:

START n=node(*) RETURN n ORDER BY n.startDate? DESC LIMIT 1
Другие вопросы по тегам