2013-09-23 43 views
0

我剛開始使用Neo4jClient和Cypher,令人驚訝的是,我沒有找到任何使用在密碼查詢where子句中的DateTime字段的網絡上的任何示例。Neo4jClient的日期時間屬性 - 如何找到與Cypher日期之間的所有節點

當我的努力得到過濾上一個DateTime屬性一些節點,查詢不返回任何結果,這裏是什麼,我想一個例子:

說我找了所有的HR讓員工出生日期在一定時間範圍內的舉止。我正在嘗試構建的查詢如下所示。

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}); 

這裏員工 - > DOB/searchStart/searchEnd都是的DateTimeOffset字段和被表示爲「1990-09-28T19經由neo4jclient存儲在圖中的數據: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屬性。

問候,基蘭

+0

你從哪裏得到的查詢表示? QueryParameters或DebugQueryText? –

+0

@TathamOddie:謝謝,我直到現在才注意到這些屬性,所以使用IDE的QuickWatch窗口從那裏獲取查詢。我現在看到參數在QueryParameters和QueryText中正確表示,但是不返回結果。可能是數據庫中的數據沒有正確存儲,因爲我在管理窗口中將值看作字符串。我怎麼知道屬性本身的實際數據類型,可能是它出錯了? – Kiran

+1

順便說一句剛剛遇到帖子http://blog.nigelsmall.com/2012/09/modelling-dates-in-neo4j.html,看起來DateTime不是在neo4j支持,這真的很奇怪,因爲我認爲它很常見按時間窗口過濾事物。其他人如何處理? – Kiran

回答

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) 
0

還有一整本關於Neo4J的O'Reilly書(他們給出了一個免費的Neo4J網站的電子版本:http://www.neo4j.org/learn)關於管理日期,我相信迴應上面鏈接的博客中的信息。即他們建議將日期作爲節點(即與月份節點關係的年度節點,與日節點的關係)放入數據庫,然後將所有日期敏感節點鏈接到相關日期。

會得到一個有點痛苦的,如果你想衡量毫秒的事情,但...

相關問題