Neo4j 数据导入案例NorthWind load csv

介绍如何从关系数据库,以csv的文件格式,导入数据到neo4j数据库。重点理解关系数据库和图形数据库建模的联系。

一、 Northwind 数据库介绍

社区版本的数据样例,主要用来练习sql语句的查询。有较为丰富的表结构和复杂的 关联关系。
在这里插入图片描述
两个核心思想

  • 列row代表一个节点node
  • 一个表table代表一个标签lable

二、数据导入

1,load csv命令导入数据

dbms.directories.import=import 配置文件该参数表示load csv的默认访问路径在import文件夹下面
参考:neo4j server\neo4j-community-3.5.0\import
点击csv文件下载链接

下载后把数据放在import文件夹下,执行以下命令创建角色节点

// Create customers
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/customers.csv" AS row
CREATE (:Customer {companyName: row.CompanyName, customerID: row.CustomerID, fax: row.Fax, phone: row.Phone});

// Create products
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/products.csv" AS row
CREATE (:Product {productName: row.ProductName, productID: row.ProductID, unitPrice: toFloat(row.UnitPrice)});

// Create suppliers
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/suppliers.csv" AS row
CREATE (:Supplier {companyName: row.CompanyName, supplierID: row.SupplierID});

// Create employees
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/employees.csv" AS row
CREATE (:Employee {employeeID:row.EmployeeID,  firstName: row.FirstName, lastName: row.LastName, title: row.Title});

// Create categories
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/categories.csv" AS row
CREATE (:Category {categoryID: row.CategoryID, categoryName: row.CategoryName, description: row.Description});

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/orders.csv" AS row
MERGE (order:Order {orderID: row.OrderID}) ON CREATE SET order.shipName =  row.ShipName;

解释:

  1. periodic commit 指示Neo4j在执行完一定行数后提交数据再继续,默认执行1000行,即每1000行提交一次
  2. WITH HEADERS 表示input文件第一行是header,而不是数据。可以用header的字段选择插入
  3. AS row,row是标识符代表了一列。 row.header字段名代表字段值,可以给属性动态赋值。
    总结:请理解一行数据代表一个节点,一个表文件代表一个角色label。

2、 建立索引

通过上面语句建立了大量的彼此之间毫无联系的节点。为了加快建立关系速度,给所有节点加上索引。

CREATE INDEX ON :Product(productID);
CREATE INDEX ON :Product(productName);
CREATE INDEX ON :Category(categoryID);
CREATE INDEX ON :Employee(employeeID);
CREATE INDEX ON :Supplier(supplierID);
CREATE INDEX ON :Customer(customerID);
CREATE INDEX ON :Customer(customerName);
#以在NODE或关系的属性上创建唯一约束。
CREATE CONSTRAINT ON (o:Order) ASSERT o.orderID IS UNIQUE;

3 创建节点间关系

3.1 建立order和product,customer,employee关系
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/orders.csv" AS row
MATCH (order:Order {orderID: row.OrderID})
MATCH (product:Product {productID: row.ProductID})
MERGE (order)-[pu:PRODUCT]->(product)
ON CREATE SET pu.unitPrice = toFloat(row.UnitPrice), pu.quantity = toFloat(row.Quantity);

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/orders.csv" AS row
MATCH (order:Order {orderID: row.OrderID})
MATCH (employee:Employee {employeeID: row.EmployeeID})
MERGE (employee)-[:SOLD]->(order);

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/orders.csv" AS row
MATCH (order:Order {orderID: row.OrderID})
MATCH (customer:Customer {customerID: row.CustomerID})
MERGE (customer)-[:PURCHASED]->(order);

解释

  1. 加载order文件,找到order和product的所有节点。这里的match不是匹配而是查找的意思
  2. 创建order和product的关系为PRODUCT
  3. SET 设置属性,为关系设置属性
    在这里插入图片描述
3.2 创建products, suppliers,categories的关系
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/products.csv" AS row
MATCH (product:Product {productID: row.ProductID})
MATCH (supplier:Supplier {supplierID: row.SupplierID})
MERGE (supplier)-[:SUPPLIES]->(product);

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/products.csv" AS row
MATCH (product:Product {productID: row.ProductID})
MATCH (category:Category {categoryID: row.CategoryID})
MERGE (product)-[:PART_OF]->(category);
3.3 创建员工和管理者的关系
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/employees.csv" AS row
MATCH (employee:Employee {employeeID: row.EmployeeID})
MATCH (manager:Employee {employeeID: row.ReportsTo})
MERGE (employee)-[:REPORTS_TO]->(manager);

表中两列的关系

结果查询

1,返回员工和经理报告层级
match (employee:Employee) -[:REPORTS_TO]-> (manager:Employee) return employee,manager

在这里插入图片描述

2,找到所有卖过巧克力的人以及销量
match(employee:Employee ) -[:SOLD]->(ord:Order) -[:PRODUCT]-> (product:Product {productName:"Chocolade"})  return employee.firstName,count ( ord) AS ords

总结

  1. 以上可以看出关系型数据库和图形数据库是如何转化的。但个人不推荐使用图形数据库来做上述查询,我们都很清楚关系型数据库可以很轻松达成如上功能。随着业务复杂度的提高,图形数据库使用起来会越来越复杂。二关系型数据库可以对业务拆解,有更好的效率。
  2. 图形数据库适合处理关系相关的业务逻辑
  3. 重点是通过这个案例理解图形数据库如何建立模型和处理数据的。

官网参考,适合喜欢英语阅读的人

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值