Neo4j дата и дата и время сравнения - PullRequest
1 голос
/ 21 октября 2019

У меня очень странное поведение двигателя neo4j. Давайте предположим, что у нас есть узел со свойствами типа date и datetime:

merge (n:Item {date: date("2019-10-21"), datetime: datetime("2019-10-21") }  )
return n

Эти запросы отлично работают:

match (n:Item)
where n.date>=date("2019-10-20")
return n
match (n:Item)
where n.datetime>=datetime("2019-10-20")
return n

Когда я пытаюсь сравнить дату с datetime (или datetime сдата) возвращается пустой набор данных:

match (n:Item)
where n.date>=datetime("2019-10-20")
return n
match (n:Item)
where n.datetime>=date("2019-10-20")
return n

Версия Neo4j - 3.5.11.

1 Ответ

0 голосов
/ 21 октября 2019

В neo4j вы не можете напрямую сравнивать временные значения разных типов (например, date и datetime).

  1. В вашем случае вы можете преобразовать date в datetime перед выполнением сравнения.

    Например, ваши последние 2 запроса могут преобразовать date в datetime:

    MATCH (n:Item)
    WHERE datetime({date:n.date}) >= datetime("2019-10-20")
    RETURN n;
    
    
    MATCH (n:Item)
    WHERE n.datetime >= datetime({date:date("2019-10-20")})
    RETURN n;
    
  2. Но в вашем случае использования было бы также правильным (и, возможно, более эффективным) преобразовать datetime в date (обратите внимание, что можно передавать datetime в качестве значения свойства date):

    MATCH (n:Item)
    WHERE n.date >= date({date: datetime("2019-10-20")})
    RETURN n;
    
    
    MATCH (n:Item)
    WHERE date({date: n.datetime}) >= date("2019-10-20")
    RETURN n;
    
  3. Еще один подход заключается в сравнении значений year и ordinalDay, например:

    WITH datetime("2019-10-20") AS dt
    MATCH (n:Item)
    WHERE n.date.year >= dt.year AND n.date.ordinalDay >= dt.ordinalDay
    RETURN n;
    
    WITH date("2019-10-20") AS d
    MATCH (n:Item)
    WHERE n.datetime.year >= d.year AND n.datetime.ordinalDay >= d.ordinalDay
    RETURN n;
    
...