2017-10-04 126 views
1

我有以下結構:Neo4j Cypher基於相關節點屬性的查詢。獲取節點,最大屬性值

(A)-[:many]->(B)-[:also_many]->(C) 

B有一個名稱屬性。並且C有日期屬性。 A有很多B相關,並且每個B有很多C有關。

我想獲得唯一B連同C其中c.date是最高的。

日期存儲如下:「YYYY-MM-DD HH:MM:SS」。我正在使用apoc.date.parse(date)來獲取時間戳值。

難道真的不想弄清楚如何繼續這個。

樣本數據集:

create (o:A {outlet: "SFO"}), (a:B {name: "Varun", date: "2017-04-01 00:00:00"}), (b:B {name: "Karen", date: "2017-04-12 00:00:00"}), (c:B {name: "Vicky", date: "2017-06-01 00:00:00"}), (aa:C {date: "2017-09-8 00:00:00", tag_no: "R2017123"}), (ab:C {date: "2017-09-02 00:00:00", tag_no: "R2017321"}), (ac:C {date: "2017-09-10 00:00:00", tag_no: "R2017423"}), (ad:C {date: "2017-09-23 00:00:00", tag_no: "R2017523"}), (ae:C {date: "2017-09-10 00:00:00", tag_no: "R2017930"}), (ba:C {date: "2017-09-02 00:00:00", tag_no:"R2017928"}), (bb:C {date: "2017-09-15 00:00:00", tag_no:"R2017039"}), (bc:C {date: "2017-09-10 00:00:00", tag_no:"R2017837"}), (bd:C {date: "2017-09-08 00:00:00", tag_no:"R2017022"}), (be:C {date: "2017-09-10 00:00:00", tag_no:"R2017883"}), (ca:C {date: "2017-09-11", tag_no:"R2017827"}), (cb:C {date: "2017-09-18", tag_no:"R2017322"}), (cc:C {date: "2017-09-21", tag_no:"R2017122"}), (cd:C {date: "2017-09-16", tag_no:"R2017877"}), (ce:C {date: "2017-09-08", tag_no:"R2017930"}), (o)-[:owns]->(a),(o)-[:owns]->(b),(o)-[:owns]->(c),(a)-[:subs]->(aa),(a)-[:subs]->(ab),(a)-[:subs]->(ac),(a)-[:subs]->(ad),(a)-[:subs]->(ae),(b)-[:subs]->(ba),(b)-[:subs]->(bb),(b)-[:subs]->(bc),(b)-[:subs]->(bd),(b)-[:subs]->(be),(c)-[:subs]->(ca),(c)-[:subs]->(cb),(c)-[:subs]->(cc),(c)-[:subs]->(cd),(c)-[:subs]->(ce);

我需要兩個查詢:

我想返回有日起說2014-04-01和​​和最新的相關C節點每個B節點B節點B.date。在數據集中,我有兩個C節點,它們具有相同的date。但查詢應該只返回每個B節點的一個結果。

而第二查詢是:

返回與上述的值,內日期B節點不具有與日期範圍內日期C節點,說「2017年9月1日」和「2017-09 -09" 。

+1

爲什麼你需要APOC這個?這種格式的日期可以按照字典順序排列,所以'ORDER BY c.date DESC LIMIT 1'應該可以讓你獲得最大的價值。當然,如果你想使用這個日期,你必須解析它,但你可以在應用程序代碼中做到這一點。 –

+0

我正在嘗試使用max()函數,並且此日期格式不兼容。 – notANerdDev

+0

什麼是'字典學'?這對我來說是一個新名詞。是否有一個函數可以獲得幾個節點的最高日期? – notANerdDev

回答

1

我想返回B節點,它們在日期2014-04-01和 2014-05-01之內有日期,並且由B.date返回每個B節點的最新相關C節點。在 數據集中,我有兩個具有相同日期的C節點。但查詢 應該只返回每個B節點的一個結果。

這應該工作:

MATCH (b:B)-[:subs]->(c:C) 
// filter b nodes by date range 
WHERE b.date >= "2017-04-01" and b.date <= "2017-04-15" 
// store c nodes into collection and get the max date for c nodes 
// grouped by b 
WITH b as b, collect(c) as cs, MAX(c.date) as maxDate 
// return b, filtering only c nodes that date are equals to maxDate 
// getting only the first filtered 
return b, filter(c in cs WHERE c.date = maxDate)[0] 

與上述的值,其不具有與一個時間範圍內的日期爲C 節點內的日期返回b節點,說「2017年9月1日「和」2017-09-09「。

這:

MATCH (b:B)-[:subs]->(c:C) 
WHERE (b.date >= "2017-04-01" and b.date <= "2017-04-15") 
AND (c.date <= "2017-09-01" and c.date >= "2017-09-09") 
RETURN b 
+0

Nah。對於每個B節點,我需要該B節點的所有相關C節點中具有最高日期的C節點。 – notANerdDev

+0

@notANerdDev你能分享一個樣本數據集嗎?這樣可以更容易地幫助你。 –

+0

好的。給我一點時間。我將編寫一個密碼查詢爲您創建一個示例數據集。萬分感謝。 – notANerdDev

相關問題