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

时间:2019-01-29 10:24:46

标签: csv neo4j cypher

我有以下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

1 个答案:

答案 0 :(得分: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
相关问题