本地安装好Neo4j:清除所有的节点和关系
代码流程解读
1. 清除 Neo4j 中的现有数据
java复制代码
session.run("MATCH (n) DETACH DELETE n");
- 在创建新节点和关系之前,首先执行
MATCH (n) DETACH DELETE n
,这会删除 Neo4j 中的所有节点和它们的关系,以确保不会有旧的数据干扰。
2. 从 MySQL 数据库中读取数据并创建节点
代码中有多个 PreparedStatement
来查询 MySQL 中的三张不同表,并从中读取数据来创建 Neo4j 节点。
2.1 创建第一个表的节点
java复制代码
PreparedStatement stmt1 = mysqlConn.prepareStatement("SELECT id, unit_name FROM zcdmx_rela_ship"); ResultSet rs1 = stmt1.executeQuery(); while (rs1.next()) { long id = rs1.getLong("id"); String name = rs1.getString("unit_name"); session.run("CREATE (:Node {id: $id, name: $unit_name})", Map.of("id", id, "unit_name", name)); }
- 从
zcdmx_rela_ship
表中读取id
和unit_name
字段。 - 每一行数据会对应一个新的节点,节点类型为
Node
,并且包含id
和unit_name
两个属性。
2.2 创建第二个表的节点
java复制代码
PreparedStatement stmt2 = mysqlConn.prepareStatement("SELECT id, hyfl_name FROM zcdmx_rela_ship_hyfl"); ResultSet rs2 = stmt2.executeQuery(); while (rs2.next()) { long id = rs2.getLong("id"); String key = rs2.getString("hyfl_name"); session.run("CREATE (:Node {id: $id, name: $hyfl_name})", Map.of("id", id, "hyfl_name", key)); }
- 从
zcdmx_rela_ship_hyfl
表中读取id
和hyfl_name
字段。 - 每一行数据同样会创建一个新的节点,节点属性包括
id
和hyfl_name
。
2.3 创建第三个表的节点及关系
java复制代码
PreparedStatement stmt3 = mysqlConn.prepareStatement("SELECT id, extend_first, extend_second, extend_fourth,extend_five,extend_six,extend_eight,extend_nine FROM knowledge_base_details"); ResultSet rs3 = stmt3.executeQuery(); while (rs3.next()) { // 读取各字段 String extend_first = rs3.getString("extend_first"); String extend_second = rs3.getString("extend_second"); String extend_fourth = rs3.getString("extend_fourth"); String extend_five = rs3.getString("extend_five"); String extend_six = rs3.getString("extend_six"); String extend_eight = rs3.getString("extend_eight"); String extend_nine = rs3.getString("extend_nine"); // 创建节点 session.run("MERGE (:Node {name: $extend_fourth, extend_first: $extend_first, extend_second: $extend_second, extend_five: $extend_five, extend_six: $extend_six, extend_eight: $extend_eight, extend_nine: $extend_nine})", Map.of( "extend_first", extend_first, "extend_second", extend_second, "extend_five", extend_five, "extend_six", extend_six, "extend_eight", extend_eight, "extend_nine", extend_nine, "extend_fourth", extend_fourth )); // 创建关系:extend_first 和 extend_fourth 之间的关系 if (StrUtil.isAllNotBlank(extend_fourth, extend_first)) { session.run("MATCH (a:Node {name: $nameV}), (b:Node {name: $world}) " + "CREATE (a)-[:RELATES_TO]->(b)", Map.of("nameV", extend_fourth, "world", extend_first)); } // 创建关系:extend_nine 和 extend_fourth 之间的关系 if (StrUtil.isAllNotBlank(extend_fourth, extend_nine)) { session.run("MATCH (a:Node {name: $keyV}), (b:Node {name: $world}) " + "CREATE (a)-[:RELATES_TO]->(b)", Map.of("keyV", extend_nine, "world", extend_fourth)); } }
- 从
knowledge_base_details
表中读取多个字段。根据这些字段,创建一个Node
类型的节点,并设置多个属性。 - 使用
MERGE
来确保节点是唯一的,避免重复创建。 - 在一些字段非空时,创建节点之间的关系,使用
RELATES_TO
关系类型连接相关的节点。
3. 关键步骤解析
清除现有数据:通过
MATCH (n) DETACH DELETE n
删除现有的所有节点和关系,避免数据重复或不一致。读取 MySQL 数据:通过多次执行
PreparedStatement
和ResultSet
读取 MySQL 中的多张表,并根据这些数据创建 Neo4j 节点。创建节点:每次读取一行数据,都会在 Neo4j 中创建一个
Node
节点,并根据表的字段设置相应的属性。创建关系:通过
MATCH
和CREATE
创建节点之间的关系。这里使用了RELATES_TO
作为关系类型,表示节点间的关联。
4. 节点和关系效果
节点效果:您将看到多个
Node
节点,它们分别对应不同的表(如zcdmx_rela_ship
、zcdmx_rela_ship_hyfl
和knowledge_base_details
),并包含表中的各个字段。关系效果:不同的节点之间会形成多个
RELATES_TO
关系。例如,extend_first
和extend_fourth
之间会有一条关系,extend_nine
和extend_fourth
之间也会有一条关系。
代码操作生成节点和关系:源代码
package com.gt.demo.mcpserver.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Map;
import cn.hutool.core.util.StrUtil;
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.Session;
@SuppressWarnings("all")
public class MySqlToNeo4j {
private static final String MYSQL_URL = "jdbc:mysql://localhost:16002/jcfx_zcdmx";
private static final String MYSQL_USER = "root";
private static final String MYSQL_PASSWORD = "root@123456";
private static final String NEO4J_URI = "bolt://localhost:7687";
private static final String NEO4J_USER = "neo4j";
private static final String NEO4J_PASSWORD = "123456";
public static void main(String[] args) {
try (Connection mysqlConn = DriverManager.getConnection(MYSQL_URL, MYSQL_USER, MYSQL_PASSWORD);
Driver neo4jDriver = GraphDatabase.driver(NEO4J_URI, AuthTokens.basic(NEO4J_USER, NEO4J_PASSWORD))) {
System.out.println("开始------");
// Create nodes and relationships in Neo4j
createNodesAndRelationships(mysqlConn, neo4jDriver);
System.out.println("结束------");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Creates nodes and relationships in a Neo4j database based on data from a MySQL database.
* This method reads data from three different tables in the MySQL database, creates corresponding nodes in the Neo4j database,
* and establishes relationships between these nodes based on specific conditions.
*
* @param mysqlConn A connection object to the MySQL database, used to execute SQL statements and retrieve data.
* @param neo4jDriver A driver object for the Neo4j database, used to manage the session with the Neo4j database.
* @throws Exception Throws an exception if there is an error during database operations or data processing.
*/
private static void createNodesAndRelationships(Connection mysqlConn, Driver neo4jDriver) throws Exception {
try (Session session = neo4jDriver.session()) {
// Clear existing data in Neo4j (optional)
session.run("MATCH (n) DETACH DELETE n");
// Read data from the first table and create nodes
PreparedStatement stmt1 = mysqlConn.prepareStatement("SELECT id, unit_name FROM zcdmx_rela_ship");
ResultSet rs1 = stmt1.executeQuery();
while (rs1.next()) {
long id = rs1.getLong("id");
String name = rs1.getString("unit_name");
session.run("CREATE (:Node {id: $id, name: $unit_name})", Map.of("id", id, "unit_name", name));
}
// Read data from the second table and create nodes
PreparedStatement stmt2 = mysqlConn.prepareStatement("SELECT id, hyfl_name FROM zcdmx_rela_ship_hyfl");
ResultSet rs2 = stmt2.executeQuery();
while (rs2.next()) {
long id = rs2.getLong("id");
String key = rs2.getString("hyfl_name");
session.run("CREATE (:Node {id: $id, name: $hyfl_name})", Map.of("id", id, "hyfl_name", key));
}
// Read data from the third table and create nodes and relationships
PreparedStatement stmt3 = mysqlConn.prepareStatement("SELECT id, extend_first, extend_second, extend_fourth,extend_five,extend_six,extend_eight,extend_nine FROM knowledge_base_details");
ResultSet rs3 = stmt3.executeQuery();
while (rs3.next()) {
long id = rs3.getLong("id");
String extend_first = rs3.getString("extend_first");
String extend_second = rs3.getString("extend_second");
String extend_fourth = rs3.getString("extend_fourth");
String extend_five = rs3.getString("extend_five");
String extend_six = rs3.getString("extend_six");
String extend_eight = rs3.getString("extend_eight");
String extend_nine = rs3.getString("extend_nine");
// Create node for world if it doesn't exist
session.run("MERGE (:Node {name: $extend_fourth,extend_first : $extend_first, extend_second : $extend_second, extend_five: $extend_five,extend_six: $extend_six,extend_eight: $extend_eight,extend_nine: $extend_nine})", Map.of(
"id", id,
"extend_first", StrUtil.blankToDefault(extend_first, ""),
"extend_second", StrUtil.blankToDefault(extend_second, ""),
"extend_five", StrUtil.blankToDefault(extend_five, ""),
"extend_six", StrUtil.blankToDefault(extend_six, ""),
"extend_eight", StrUtil.blankToDefault(extend_eight, ""),
"extend_nine", StrUtil.blankToDefault(extend_nine, ""),
"extend_fourth", StrUtil.blankToDefault(extend_fourth, "")));
if (StrUtil.isAllNotBlank(extend_fourth, extend_first)) {
// Create relationship between Node(nameV) and Node(world)
session.run(
"MATCH (a:Node {name: $nameV}), (b:Node {name: $world}) " +
"CREATE (a)-[:RELATES_TO]->(b)",
Map.of("nameV", extend_fourth, "world", extend_first)
);
}
// Create relationship between Node(keyV) and Node(world)
if (StrUtil.isAllNotBlank(extend_fourth, extend_nine)) {
session.run(
"MATCH (a:Node {name: $keyV}), (b:Node {name: $world}) " +
"CREATE (a)-[:RELATES_TO]->(b)",
Map.of("keyV", extend_nine, "world", extend_fourth)
);
}
}
}
}
}
查看节点和关系效果