2016-12-24 175 views
2

好吧,我遇到了密碼查詢問題。這裏是我的查詢到目前爲止:Neo4j Cypher找到孩子沒有屬性值的節點

MATCH (oi:OrderItem)<-[:CONTAINS]-(o:Order) 
WHERE oi.productSku IN ['600790041f','600790041s','600790061','600791021f','600791021s','600791051f','600791051s','600791061af','600791061as','600791061f','600791061s','600791101','600791111','600792011f','600792011s','600792031f','600792031s','600792041f','600792041s'] 
WITH DISTINCT o 
RETURN COUNT(o) AS orders, AVG(o.orderBaseGrandTotal) AS avg; 

我所試圖做的是返回只包含產品的SKU上面列表中的所有訂單。以上查詢向我提供包含具有這些SKU之一的產品的所有訂單。但是,我需要過濾掉也有SKU列表以外的產品的訂單(我不想要這些訂單)。

本質上,我試着說給我所有的訂單,只有在這個SKU列表中的產品,並返回給我這些訂單的訂單數量和平均訂單價值。我堅持的部分是過濾掉也在SKU列表之外的產品的訂單。

+0

你能提供一個測試數據庫嗎?我非常有信心,今天晚些時候我可以爲你解決這個問題。在我看來,你可能想要使用另一個'WHERE'子句。 – manonthemat

回答

2

您需要計算每個訂單的SKU清單中的物品數量,然後將其與每個訂單的物品總數進行比較。

MATCH (oi:OrderItem)<-[:CONTAINS]-(o:Order) 
WHERE oi.productSku IN ['600790041f','600790041s','600790061',...] 

// get the total number of sku items per order 
WITH o, count(*) as num_items 

// only return the orders where the number of items in the order 
// is equivalent to the number of sku items matched 
WHERE size((o)-[:CONTAINS]->()) = num_items 
RETURN COUNT(o) AS orders, AVG(o.orderBaseGrandTotal) AS avg; 
+0

啊哈。這就說得通了。我來自SQL世界,仍然在學習Cypher能做的事情。謝謝您的幫助! – ryanpitts1

相關問題