我刚开始使用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
答案 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)关于管理日期,我认为这与博客中的信息相呼应与上述相关联。即他们建议将日期作为节点(即与月节点有关系的年节点,与日节点的关系)放入数据库,然后将所有日期敏感节点链接到相关日期。
如果你想用毫秒测量东西会有点痛苦,不过......