Neo4jClient datetime属性 - 如何使用Cypher查找日期之间的所有节点

时间:2013-09-23 16:03:47

标签: neo4j cypher neo4jclient

我刚开始使用Neo4jClient和Cypher,令人惊讶的是我没有在网上找到任何使用cypher query where子句中的DateTime字段的例子。

当我试图在DateTime属性上过滤一些节点时,查询没有返回任何结果,这是我尝试的一个例子:

说我正在寻找人力资源行为的所有制造员工,他们的出生日期在一个时间范围内。我正在尝试构建的查询如下所示。

client.Cypher
    .Start(new { company = companyNode.Reference})
    .Match("(department)<-[:BELONGS_TO]-(employee)-[:BELONGS_TO]->(company)")
    .Where<Department>(department=>department.Name=='Human Resource')
    .AndWhere<Employee>(employee=> employee.DOB >= searchStart && employee.DOB<= searchEnd)
    .ReturnDistinct((employee)=> new {name = employee.Name});

此处Employee-&gt; DOB / searchStart / searchEnd均为DateTimeOffset字段,并且通过neo4jclient存储在图表中的数据表示为“ 1990-09-28T19:02:21.7576376 + 05:30

当我调试代码时,我发现Neo4jClient实际上将查询表示为类似

AND ((employee.DOB >=10/3/1988 8:16:41 PM +03:00) AND (employee.DOB <=10/3/2003 8:16:41 PM +03:00))

当我摆脱DOB where子句时,我确实得到了结果。

如果有人能指出我如何在查询中使用DateTimeOffset属性,我真的很感激。

此致,Kiran

2 个答案:

答案 0 :(得分:1)

使用DateTimeOffset对我来说很好:

private static IList<Node<DateOffsetNode>> Between(IGraphClient client, DateTimeOffset from, DateTimeOffset to)
{
    ICypherFluentQuery<Node<DateOffsetNode>> query = new CypherFluentQuery(client)
        .Start(new { n = All.Nodes })
        .Where((DateOffsetNode n) => n.Date <= to && n.Date >= from)
        .Return<Node<DateOffsetNode>>("n");

    return query.Results.ToList();
}

DateOffsetNode只是:

public class DateOffsetNode { public DateTimeOffset Date { get;set; } }

但另一种方法是存储ticks值并与之进行比较:

.Where((DateObj o) => o.Ticks < DateTime.Now.Date.Ticks)

我通常将DateObj定义为:

public class DateObj {
    public long Ticks { get;set; }
    public int Year { get;set; }
    public int Month { get;set;}
    public int Day { get;set;}

    public DateObj(){}
    public DateObj(DateTime dt){
        Ticks = dt.Date.Ticks;
        Year = dt.Date.Year;
        Month = dt.Date.Month;
        Day = dt.Date.Day;
    }
}

所以我也可以这样做:

.Where((DateObj o) => o.Year == 2013)

一段时间的等价物是在DateTime对象上使用类似TotalMilliseconds属性的东西:

.Where((TimeObj o) => o.TimeMs < DateTime.Now.TimeOfDay.TotalMilliseconds)

答案 1 :(得分:0)

还有关于Neo4J的O'Reilly书的全部内容(他们在这里提供了一个免费的Neo4J网站的电子版本:http://www.neo4j.org/learn)关于管理日期,我认为这与博客中的信息相呼应与上述相关联。即他们建议将日期作为节点(即与月节点有关系的年节点,与日节点的关系)放入数据库,然后将所有日期敏感节点链接到相关日期。

如果你想用毫秒测量东西会有点痛苦,不过......