基于过滤器的第一个cypher查询输出(子查询)

问题描述 投票:0回答:1

我有以下csv。

我创建了节点和关系如下:

LOAD CSV WITH HEADERS FROM "file:///invoice.csv" AS row  
CREATE (INVOICE:INVOICE {TRANS_DATE: row.TRANS_DATE,INVOICE_NO: row.INVOICE_NO,ARTICLE_NO: row.ARTICLE_NO,CUSTOMER_NO: row.CUSTOMER_NO,AMT: row.AMT,QTY: row.QTY})
MERGE (ARTICLE:ARTICLE {product_no: row.ARTICLE_NO})
CREATE (INVOICE)-[:contains]->(ARTICLE); 

现在我可以查询其文章不止一个的发票:

match (i:INVOICE) 
 with i.INVOICE_NO as INVOICE_NO, count(*) as INV_CNT
 where INV_CNT > 1 
 return INVOICE_NO,INV_CNT 

现在我想展示上面发票中包含的文章。我尝试了很多,但没有成功。我很感谢你们的帮助。

invoice.csv

sr_no,TRANS_DATE,TICKET_NO,ARTICLE_NO,CUSTOMER_NO,AMT,QTY
1,20190101,1,1,1,200,1
2,20190101,1,2,1,500,4
3,20190101,2,1,1,20,5
4,20190101,3,4,1,20,6
5,20190101,4,5,4,20,7
6,20190101,4,6,4,20,1
7,20190101,4,1,4,20,2
8,20190101,5,1,9,20,2
9,20190101,6,2,10,20,1
10,20190101,7,8,11,20,1
11,20190101,8,4,21,20,1
12,20190101,8,5,21,20,1
13,20190101,9,1,25,20,1
14,20190101,10,11,50,20,5
15,20190101,11,11,14,20,1
16,20190101,12,12,14,20,1
17,20190101,13,4,10,20,3
18,20190101,14,14,1,20,1
19,20190101,14,14,1,20,2
20,20190101,14,14,1,20,200
csv neo4j cypher
1个回答
1
投票

我假设你的查询得到“文章多于一个的发票”是正确的,并添加了如何添加可选匹配来获取文章列表。

对于每个发票,它将可选地匹配该条款。

MATCH (i:INVOICE) 
OPTIONAL MATCH (i)-[:contains]->(a:ARTICLE)
WITH i.INVOICE_NO AS INVOICE_NO, COUNT(*) AS INV_CNT, COLLECT(a) AS articles
WHERE INV_CNT > 1 
RETURN INVOICE_NO, INV_CNT, articles

你可以简化它:

MATCH (i:INVOICE)-[:contains]->(a:ARTICLE)
WITH i.INVOICE_NO AS INVOICE_NO, COUNT(*) AS INV_CNT, COLLECT(a) AS articles
WHERE INV_CNT > 1 
RETURN INVOICE_NO, INV_CNT, articles
© www.soinside.com 2019 - 2024. All rights reserved.