欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 千云物流 -低代码使用neo4J

千云物流 -低代码使用neo4J

2024/10/25 1:35:50 来源:https://blog.csdn.net/u013642886/article/details/142214577  浏览:    关键词:千云物流 -低代码使用neo4J

Graph 基础知识

图库基本概念

图形数据库可以使用几个简单的概念存储任何类型的数据:

  • 节点 - 图形数据记录
  • 关系 - 连接节点
  • Properties - 命名数据值

图形数据库

Neo4j 将数据存储在 Graph 中,其中的记录称为 Nodes。
最简单的图形只有一个节点,其中包含一些名为 Properties 的命名值。 让我们画一张 Neo4j 团队中朋友的社交图谱:

  • 首先为节点绘制一个圆
  • 添加名称 Emil
  • 请注意,他来自瑞典
  • 节点是图形中数据记录的名称
  • 数据存储为 Properties
  • 属性是简单的名称/值对
    在这里插入图片描述

标签

可以通过对每个成员应用 Label 将节点分组在一起。 在我们的社交图中,我们将标记代表 Person 的每个节点。

  • 将标签 “Person” 应用于我们为 Emil 创建的节点
  • 将 “Person” 节点颜色为红色
  • 一个节点可以有零个或多个标签
  • 标签没有任何属性

更多节点

与任何数据库一样,在 Neo4j 中存储数据也可以同样简单 作为添加更多记录。我们将添加更多节点:

  • Emil 的 klout 分数为 99
  • Johan,来自瑞典,正在学习冲浪
  • Ian,来自英国,是一位作家
  • 来自比利时的 Rik 有一只名叫 Orval 的猫
  • Allison,来自加利福尼亚,喜欢冲浪
  • 相似的节点可以具有不同的属性
  • 属性可以是字符串、数字或布尔值
  • Neo4j 可以存储数十亿个节点
    在这里插入图片描述

关系

Neo4j 的真正强大之处在于互连数据。要关联任意两个节点, 添加一个 Relationship,用于描述记录的关联方式。
在我们的社交图谱中,我们简单地说谁认识谁:

  • Emil 认识 Johan 和 Ian
  • Johan 认识 Ian 和 Rik
  • Rik 和 Ian 认识 Allison
  • 关系总是有方向的
  • 关系始终具有类型
  • 关系形成数据模式
    在这里插入图片描述

关系属性

在属性图中,关系是数据记录,这些数据记录还可以 contain 属性。 更仔细地观察 Emil 的人际关系,请注意:

  • Emil 从 2001 年开始就认识 Johan
  • Emil 给 Ian 打 5 分(满分 5 分)
  • 其他所有人都可以具有类似的关系属性
    在这里插入图片描述

实际操作

Cypher 语言

Neo4j 的图形查询语言,Neo4j 的 Cypher 语言是专门为处理图形数据而构建的。

  • 使用模式来描述图形数据
  • 熟悉的类似 SQL 的子句
  • 声明式的,描述要查找的内容,而不是如何查找

创建节点

让我们使用 Cypher 生成一个小型社交图谱。

CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })
  • CREATE子句创建数据
  • ()括号表示节点
  • ee:Person新节点的变量 ‘ee’ 和标签 ‘Person’
  • {}用于向节点添加属性的括号

查找节点

MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee;
  • MATCH子句指定节点和关系的模式
  • (ee:Person)带有标签 ‘Person’ 的单节点模式,它将匹配分配给变量 ‘ee’
  • WHERE子句来约束结果
  • ee.name = "Emil"将 name 属性与值 “Emil” 进行比较
  • RETURN用于请求特定结果的子句

创建节点和关系

CREATE子句可以一次创建多个节点和关系。

MATCH (ee:Person) WHERE ee.name = "Emil"
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ir:Person { name: "Ian", from: "England", title: "author" }),
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)

匹配查询

描述要在图表中查找的内容,例如,可以使用 pattern 来查找 Emil 的朋友:

MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = "Emil" RETURN ee, friends
  • MATCH子句来描述从已知节点到已找到节点的模式
  • (ee)以 Person 开始模式(由 WHERE 限定)
  • -[:KNOWS]-匹配 “KNOWS” 关系(在任一方向上)
  • (friends)将与 Emil 的朋友绑定

匹配推荐

模式匹配可用于进行推荐。Johan 正在学习冲浪,因此他可能想找到 已经这样做的新朋友:

MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer
  • ()空括号忽略这些节点
  • DISTINCT因为多个路径将匹配模式
  • surfer将包含 Allison,一个冲浪朋友的朋友

查询分析

使用可视化查询计划,通过预置 或EXPLAIN PROFILE命令

PROFILE MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer

关系数据到图库

准备工作

如何从 关系数据库转换为 Neo4j。转型 是迭代和深思熟虑的,强调了从 关系表添加到图形的节点和关系中。

  • 加载:从本机CSV 文件创建数据,
  • Index:基于标签的索引节点
  • Relate:将外键引用转换为数据关系
  • 提升:将联接记录转换为关系
    在neo4j.conf中配置配置文件
# 开启本地加载文件,将需要的svc文件放neo4j的安装目录下import文件夹中.
dbms.security.allow_csv_import_from_file_urls=true

加载以下文件在这里插入图片描述
可以在这里下载数据 https://download.csdn.net/download/u013642886/89751123

加载需要的数据

  • 销售用户
    在这里插入图片描述

  • 产品表
    在这里插入图片描述

  • 分类表
    在这里插入图片描述

  • 供应商表
    在这里插入图片描述
    在这里插入图片描述
    加载记录

-- 加载产品数据
LOAD CSV WITH HEADERS FROM "file:///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")
-- 加载分类数据LOAD CSV WITH HEADERS FROM "file:///categories.csv" AS row
CREATE (n:Category)
SET n = row
-- 加载供应商数据
LOAD CSV WITH HEADERS FROM "file:///suppliers.csv" AS row
CREATE (n:Supplier)
SET n = row

创建索引

CREATE INDEX ON :Product(productID)
CREATE INDEX ON :Category(categoryID)
CREATE INDEX ON :Supplier(supplierID)

产品关系图

产品、类别和供应商通过外键引用进行关联。 让我们将它们提升为 data relationships 以实现图形。
在这里插入图片描述
创建数据关系
请注意,您只需在首次创建关系时比较如下属性值计算连接,具体化关系。

-- 创建产品和分类的关系
MATCH (p:Product),(c:Category)
WHERE p.categoryID = c.categoryID
CREATE (p)-[:PART_OF]->(c)
-- 创建产品和供应商之间的关系
MATCH (p:Product),(s:Supplier)
WHERE p.supplierID = s.supplierID
CREATE (s)-[:SUPPLIES]->(p)

查询产品分类

-- 列出每个供应商的产品分类
MATCH (s:Supplier)-->(:Product)-->(c:Category)
RETURN s.companyName as Company, collect(distinct c.categoryName) as Categories-- 找到produce的供应商.
MATCH (c:Category {categoryName:"Produce"})<--(:Product)<--(s:Supplier)
RETURN DISTINCT s.companyName as ProduceSuppliers

客户订单创建

-- 加载客户信息
LOAD CSV WITH HEADERS FROM "file:///customers.csv" AS row
CREATE (n:Customer)
SET n = row
--加载订单西悉尼
LOAD CSV WITH HEADERS FROM "file:///orders.csv" AS row
CREATE (n:Order)
SET n = row
-- 创建客户索引
CREATE INDEX ON :Customer(customerID)
-- 创建订单索引
CREATE INDEX ON :Order(orderID)
-- 匹配建立关系
MATCH (c:Customer),(o:Order)
WHERE c.customerID = o.customerID
CREATE (c)-[:PURCHASED]->(o)

在这里插入图片描述

Order Details 始终是 Order 的一部分,并且它们将 Order 与 Product 相关联 — 它们是一个联接表。联接表 始终是数据关系的标志,表示共享信息 在另外两条记录之间。
在这里,我们将直接将每个 OrderDetail 记录提升到图表中的一个关系中。

-- 加载订单详情
LOAD CSV WITH HEADERS FROM "file:///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)
-- 建立绑定关系
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 TotalProductsPurchased

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com