neo4j数据库创建范例(SQL文)

SQL文:

sql 复制代码
SELECT c.id, c.name, o.amount
FROM customers c
JOIN orders o ON c.id = o.customer_id
  1. 先创建节点(Table、Column)。
  2. 再 MATCH 出节点,建立关系

✅ 针对你的 SQL 的完整 Cypher

cypher 复制代码
// -----------------------------
// 1. 创建表节点
// -----------------------------
MERGE (t_customers:Table {name: "customers"});
MERGE (t_orders:Table {name: "orders"});

// -----------------------------
// 2. 创建字段节点
// -----------------------------
MERGE (col_c_id:Column {name: "id", table: "customers"});
MERGE (col_c_name:Column {name: "name", table: "customers"});
MERGE (col_o_amount:Column {name: "amount", table: "orders"});
MERGE (col_o_customer_id:Column {name: "customer_id", table: "orders"});

// -----------------------------
// 3. 建立表-字段关系
// -----------------------------
MATCH (t_customers:Table {name: "customers"}), (col_c_id:Column {name: "id", table:"customers"})
MERGE (t_customers)-[:HAS_COLUMN]->(col_c_id);

MATCH (t_customers:Table {name: "customers"}), (col_c_name:Column {name: "name", table:"customers"})
MERGE (t_customers)-[:HAS_COLUMN]->(col_c_name);

MATCH (t_orders:Table {name: "orders"}), (col_o_amount:Column {name: "amount", table:"orders"})
MERGE (t_orders)-[:HAS_COLUMN]->(col_o_amount);

MATCH (t_orders:Table {name: "orders"}), (col_o_customer_id:Column {name: "customer_id", table:"orders"})
MERGE (t_orders)-[:HAS_COLUMN]->(col_o_customer_id);

// -----------------------------
// 4. 建立字段间 JOIN 关系
// -----------------------------
MATCH (col_c_id:Column {name:"id", table:"customers"}),
      (col_o_customer_id:Column {name:"customer_id", table:"orders"})
MERGE (col_c_id)-[:JOINS {on:"="}]->(col_o_customer_id);

🔍 查询验证

cypher 复制代码
MATCH (t:Table)-[:HAS_COLUMN]->(c:Column)
RETURN t.name AS table, c.name AS column;

MATCH (c1:Column)-[j:JOINS]->(c2:Column)
RETURN c1.table AS table1, c1.name AS column1,
       j.on AS condition,
       c2.table AS table2, c2.name AS column2;

结果应该是:

表-字段

复制代码
table      | column
-----------+------------
customers  | id
customers  | name
orders     | amount
orders     | customer_id

JOIN 关系

复制代码
table1     | column1 | condition | table2 | column2
-----------+---------+-----------+--------+------------
customers  | id      | =         | orders | customer_id

完整的扩展方案,把 SQL JOIN 的信息 全部带进 Neo4j 的关系属性里。


1. SQL 信息里能提取的点

像你这句:

sql 复制代码
SELECT c.id, c.name, o.amount
FROM customers c
JOIN orders o ON c.id = o.customer_id;

可抽取出来的 JOIN 元数据:

  • 关系条件c.id = o.customer_id
  • 连接符号=
  • JOIN 类型INNER JOIN(省略 INNER 默认就是 INNER)
  • 左表字段customers.id
  • 右表字段orders.customer_id

2. 在 Neo4j 里扩展关系属性

建关系时,不只存 on:"=",而是存完整信息:

cypher 复制代码
MERGE (col_c_id:Column {name:"id", table:"customers"})
MERGE (col_o_customer_id:Column {name:"customer_id", table:"orders"})
MERGE (col_c_id)-[:JOINS {
    condition: "c.id = o.customer_id",
    operator: "=",
    join_type: "INNER",
    left_table: "customers",
    left_column: "id",
    right_table: "orders",
    right_column: "customer_id"
}]->(col_o_customer_id);

3. 查询结果更直观

cypher 复制代码
MATCH (c1:Column)-[j:JOINS]->(c2:Column)
RETURN j.join_type AS join_type,
       j.condition AS condition,
       j.left_table AS left_table,
       j.left_column AS left_column,
       j.operator AS operator,
       j.right_table AS right_table,
       j.right_column AS right_column;

结果就会是:

复制代码
join_type | condition               | left_table | left_column | operator | right_table | right_column
----------+--------------------------+------------+-------------+----------+-------------+--------------
INNER     | c.id = o.customer_id    | customers  | id          | =        | orders      | customer_id

4. 通用做法

  • condition:存完整 SQL 条件
  • operator :存 =>< 这种符号
  • join_type :存 INNER / LEFT / RIGHT / FULL
  • left_table / right_table:存表名
  • left_column / right_column:存字段名

这样以后你要还原 SQL JOIN,或者做可视化,都很方便。


相关推荐
Wang's Blog7 分钟前
MySQL: 服务器性能优化全面指南:参数配置与数据库设计的最佳实践
服务器·数据库·mysql
码农101号21 分钟前
Mysql主从架构的搭建
数据库·mysql·架构
cqsztech34 分钟前
ORACLE数据库中如何找到过去某个时间某个表被谁修改了
数据库·oracle
好记忆不如烂笔头abc1 小时前
sql评估存储的速度和稳定性
数据库·sql
小鹏linux1 小时前
《openGauss安全架构与数据全生命周期防护实践:从技术体系到行业落地》
数据库·opengauss·gaussdb
朝新_2 小时前
【实战】动态 SQL + 统一 Result + 登录校验:图书管理系统(下)
xml·java·数据库·sql·mybatis
装不满的克莱因瓶2 小时前
什么是脏读、幻读、不可重复读?Mysql的隔离级别是什么?
数据库·mysql·事务·隔离级别·不可重复读·幻读·脏读
aramae2 小时前
MySQL数据库入门指南
android·数据库·经验分享·笔记·mysql
Apache IoTDB3 小时前
时序数据库 IoTDB 集成 MyBatisPlus,告别复杂编码,简化时序数据 ORM 开发
数据库·struts·servlet·时序数据库·iotdb
isNotNullX3 小时前
怎么用数据仓库来进行数据治理?
大数据·数据库·数据仓库·数据治理