(三)Neo4j自带northwind案例--Cypher语言应用
0、概述
通過該案例,應用Cypher查詢語言,感受Neo4j套路。官方的用此案例的用意:
The?Northwind Graph?demonstrates how to migrate(遷移) from a relational database to Neo4j(把一個負責的多表關系數據庫關系等價轉化為圖數據中,并且查詢表現出巨大的優勢). The transformation is iterative and deliberate, emphasizing the conceptual shift from relational tables to the nodes and relationships of a graph.
This guide will show you how to:
1、找到位置
:play start彈出如下界面:
northwind點擊中間的“Jump into code”,進入到如下界面:
Northwind?
這里有Movie Graph和Northwind Graph兩個案例,這里演示第二個案例。
2、?Load: create data from external products CSV files
LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/products.csv" AS row CREATE (n:Product) SET n = row, n.unitPrice = toFloat(row.unitPrice), n.unitsInStock = toInteger(row.unitsInStock), n.unitsOnOrder = toInteger(row.unitsOnOrder), n.reorderLevel = toInteger(row.reorderLevel), n.discontinued = (row.discontinued <> "0")------------------------------------------------------------------------- 1、LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/products.csv" AS row return row,這個row到底是什么呢? {"reorderLevel": "10","unitsInStock": "39","unitPrice": "18.00","supplierID": "1","productID": "1","discontinued": "0","quantityPerUnit": "10 boxes x 20 bags","categoryID": "1","unitsOnOrder": "0","productName": "Chai" } {"reorderLevel": "25","unitsInStock": "17","unitPrice": "19.00","supplierID": "1","productID": "2","discontinued": "0","quantityPerUnit": "24 - 12 oz bottles","categoryID": "1","unitsOnOrder": "40","productName": "Chang" } .....(后面還有) 2、SET n = row 是建立了77 labels,對應到關系數據庫就是用上面的屬性結構和數據建立了77條紀律; 3、n.unitPrice = toFloat(row.unitPrice), 有些屬性要用Neo4j的字段類型進行強制說明,以免出錯;3、?Load: create data from external categories CSV files
LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/categories.csv" AS row CREATE (n:Category) SET n = row4、?Load: create data from external suppliers CSV files
LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/suppliers.csv" AS row CREATE (n:Supplier) SET n = row5、Create indexes
# 以下三個分開執行 CREATE INDEX ON :Product(productID) CREATE INDEX ON :Category(categoryID) CREATE INDEX ON :Supplier(supplierID)6、Create data relationships
# Product和Category建立PART_OF關系,一個Category可以有多個Product, # 這個是很自然的隸屬關系(PART_OF),注意where的這種查詢方式 MATCH (p:Product),(c:Category) WHERE p.categoryID = c.categoryID CREATE (p)-[:PART_OF]->(c)# 查詢所建立的PART_OF關系 MATCH p=()-[r:PART_OF]->() RETURN p LIMIT 80000形成的圖關系如下所示,里面顯示的數量可以簡單分析一下,所有的Product(77)都找到了隸屬的類,一共隸屬8個Category(8),所以下圖中共有8組圖,共有77+8=85(nodes)。
查詢PART_OF關系 # 建立Products和Supplier之間的關系 MATCH (p:Product),(s:Supplier) WHERE p.supplierID = s.supplierID CREATE (s)-[:SUPPLIES]->(p)# 查詢關系如下圖 MATCH p=()-[r:SUPPLIES]->() RETURN p LIMIT 2555 查詢SUPPLIES關系7、Query using patterns
# 查詢關聯上的nodes MATCH (s:Supplier)-->(:Product)-->(c:Category) RETURN s.companyName as Company, collect(distinct c.categoryName) as Categories# collect(distinct c.categoryName)是做了去重處理,一個s:Supplier可以 # 有很多Product,每一個Product只對應一個c:Category,所有一個s:Supplier # 的兩件不同的Product可能對應相同的c:Category查詢結果如下:
這樣的查詢時不直觀的,既然建立了三種節點之間的兩種關系,那么在圖譜中是什么樣子呢?
# 查詢PART_OF和SUPPLIES兩種關系的節點 MATCH p=()-[r1:PART_OF]-()-[r2:SUPPLIES]-() RETURN p LIMIT 2500 All Relation?
# 一個s:Supplier可以對應多個Product # 一個Product屬于一個categoryName # 查詢可以提供Produce類別Product的s:Supplier,返回結果去重 MATCH (c:Category {categoryName:"Produce"})<--(:Product)<--(s:Supplier) RETURN DISTINCT s.companyName as ProduceSuppliers8、?Load: create data from external Customer、Orders?CSV files
LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/customers.csv" AS row CREATE (n:Customer) SET n = rowLOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/orders.csv" AS row CREATE (n:Order) SET n = rowCREATE INDEX ON :Customer(customerID)CREATE INDEX ON :Order(orderID)9、Create data relationships
MATCH (c:Customer),(o:Order) WHERE c.customerID = o.customerID CREATE (c)-[:PURCHASED]->(o)MATCH p=()-[r:PURCHASED]->() RETURN p LIMIT 25 查詢PURCHASED關系?
10、?Load: create data from external order-details?CSV files
# 到這一步實體對象就多了,之前有: # Sublier-[:SUBLIES]->Product-[:PART_OF]->Category # Customer-[:PURCHASED]->Order # 上面兩種圖之間是不聯通的,下面還要建立Order-[details:ORDERS]->p:Product) # 這樣所有的實體都聯通了,注意多次執行不會覆蓋,會建立重名ORDERS關系,本質上是兩個系統id LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/order-details.csv" AS row MATCH (p:Product), (o:Order) WHERE p.productID = row.productID AND o.orderID = row.orderID CREATE (o)-[details:ORDERS]->(p) SET details = row, details.quantity = toInteger(row.quantity)11、Query using patterns
# 圖數據庫的匹配是一種結構匹配,而不是屬性值匹配 # 譬如(cust:Customer)-[:PURCHASED]->(:Order)-[o:ORDERS]->(p:Product)- # [:PART_OF]->(c:Category {categoryName:"Produce"})就是一種結構 # 下面的意思是說:找到買Produce類的Customer的名字,并且計算該用戶訂單上 # 所有Product價格的總和,這在電商中是非常有意義的 # 和關系數據庫相比,這就體現了圖數據庫多個表鏈接查詢的重大優勢 MATCH (cust:Customer)-[:PURCHASED]->(:Order)-[o:ORDERS]->(p:Product)-[:PART_OF]->(c:Category {categoryName:"Produce"}) RETURN DISTINCT cust.contactName as CustomerName, SUM(o.quantity) AS TotalProductsPurchased# 官網給出的是如下的方式,和上面等價的 MATCH (cust:Customer)-[:PURCHASED]->(:Order)-[o:ORDERS]->(p:Product),(p)-[:PART_OF]->(c:Category {categoryName:"Produce"}) RETURN DISTINCT cust.contactName as CustomerName, SUM(o.quantity) AS TotalProductsPurchased12、我們的圖譜長什么樣子呢?
圖譜結構 # 圖關系要拆分成具有線性關系的r1,r2,鏈接起立展示 MATCH r1=(cust:Customer)-[:PURCHASED]->(:Order)-[o:ORDERS]->(p:Product),r2=(sup:Supplier)-[:SUPPLIES]-(p)-[:PART_OF]->(c:Category {categoryName:"Produce"}) RETURN r1, r2 limit 1 圖譜展示?
總結
以上是生活随笔為你收集整理的(三)Neo4j自带northwind案例--Cypher语言应用的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: JavaScript编程用法——Java
- 下一篇: matplotlib plot 分组_小
