2017-10-04 104 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

相关问题