neo4j数据库创建范例(SQL文)
SQL文:
SELECT c.id, c.name, o.amount
FROM customers c
JOIN orders o ON c.id = o.customer_id
- 先创建节点(Table、Column)。
- 再 MATCH 出节点,建立关系。
✅ 针对你的 SQL 的完整 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);
🔍 查询验证
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 信息里能提取的点
像你这句:
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:"="
,而是存完整信息:
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. 查询结果更直观
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,或者做可视化,都很方便。