[英]Neo4j query to ignore parent nodes which doesn't satisfy a condition but keep the same structure
[英]Neo4j Query - Find all nodes which satisfy a property condition and have relationship
我有一個成功運行的查詢:
match (n:A {tag_no:"N2203"})<-[:rel_a]-(v:B)-[:rel_b]->(r)<-[:rel_c]-(n) WHERE (v.invoice_date>="2012-08-01" AND v.invoice_date<"2016-02-01") with v, collect(r) as rs where all (x in rs where x.date<"2016-08-01") return count(v) as count;
我需要進一步過濾此查詢。
我需要r nodes with max(r.date) for each v
關聯r nodes with max(r.date) for each v
,並找出其中有多少個節點與另一個D
類型的節點有關系
我正在嘗試此查詢,它引發語法錯誤
match (n:A {tag_no:"N2203"})<-[:rel_a]-(v:B)-[:rel_b]->(r)<-[:rel_c]-(n) WHERE (v.invoice_date>="2012-08-01" AND v.invoice_date<"2016-02-01") with v, max(r.date) as date collect(r) as rs where (all (x in rs where x.date<"2016-08-01") AND filter(x in rs where x.date=date)[0]<-[:rel_c]-(d:D)) return count(v) as count;
我還嘗試了許多其他組合,但是都拋出了一些語法錯誤。 感謝所有幫助。
主要問題是查詢解析器現在無法確定filter(x in rs where x.date=date)[0]
確實是一個節點,因此語法中不允許這樣做。 幸運的是,有可能以一些冗長的代價解決此問題:
WITH
子句為節點變量引入別名( n
)。 這將允許您使用WHERE <pattern>
語法。 WHERE
子句中引入新變量,因此只需使用(:D)
而不是(d:D)
。 因此查詢將如下所示(顯然,我尚未對其進行測試):
MATCH (n:A {tag_no:"N2203"})<-[:rel_a]-(v:B)-[:rel_b]->(r)<-[:rel_c]-(n)
WHERE v.invoice_date>="2012-08-01"
AND v.invoice_date<"2016-02-01"
WITH
v,
max(r.date) AS date,
collect(r) AS rs
WHERE all(x IN rs WHERE x.date<"2016-08-01")
WITH filter(x in rs where x.date=date)[0] AS n, v
WHERE (n)<-[:rel_c]-(:D)
RETURN count(v) AS count;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.