title: 导入数据到neo4j
date: 2023-10-08 13:35:49
categories:
- 大数据技术
tags:
代码
package neo4j;
import org.neo4j.driver.v1.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
public class Neo4jDataImport {
public static void main(String[] args) {
try (Driver driver = GraphDatabase.driver( "bolt://localhost:7687", AuthTokens.basic( "neo4j", "123456" ) )) {
// 读取数据集并创建节点
try (Session session = driver.session()) {
String csvFile = "input/data_low.csv"; // 数据集文件路径
//区域
Set<String> uniqueAddresses = new HashSet<>();
//房屋布局
Set<String> uniqueLayouts = new HashSet<>();
//建筑风格
Set<String> uniqueBuildingTypes = new HashSet<>();
// 朝向
Set<String> uniqueOrientations = new HashSet<>();
//装修风格
Set<String> uniqueDecorations = new HashSet<>();
// 获取电梯数量,去重
Set<String> uniqueElevatorCounts = new HashSet<>();
// 获取供暖方式,去重
Set<String> uniqueHeatingMethods = new HashSet<>();
// 获取房屋用途,去重
Set<String> uniqueHouseUses = new HashSet<>();
// 获取房屋产权,去重
Set<String> uniquePropertyOwnerships = new HashSet<>();
// 获取楼层描述,去重
Set<String> uniqueFloorDescriptions = new HashSet<>();
// 获取总楼层,去重
Set<Integer> uniqueTotalFloors = new HashSet<>();
// 获取总价格,去重
Set<Double> uniqueTotalPrices = new HashSet<>();
// 获取单价,去重
Set<Double> uniqueUnitPrices = new HashSet<>();
try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
String line;
while ((line = br.readLine()) != null) {
String[] data = line.split(","); // 假定CSV文件使用逗号分隔
// 获取房屋地址,去重
String address = data[1];
uniqueAddresses.add(address);
// 获取房屋布局,去重
String layout = data[4].trim(); // 去除空格
uniqueLayouts.add(layout);
// 获取建筑类型,去重
String buildingType = data[6].trim(); // 去除空格
uniqueBuildingTypes.add(buildingType);
// 获取朝向,去重
String orientation = data[7].trim(); // 去除空格
uniqueOrientations.add(orientation);
// 获取装修风格,去重
String decoration = data[8].trim(); // 去除空格
uniqueDecorations.add(decoration);
// 获取电梯数量,去重
String elevatorCount = data[9].trim(); // 去除空格
uniqueElevatorCounts.add(elevatorCount);
// 获取供暖方式,去重
String heatingMethod = data[10].trim(); // 去除空格
uniqueHeatingMethods.add(heatingMethod);
// 获取房屋用途,去重
String houseUse = data[11].trim(); // 去除空格
uniqueHouseUses.add(houseUse);
// 获取房屋产权,去重
String propertyOwnership = data[12].trim(); // 去除空格
uniquePropertyOwnerships.add(propertyOwnership);
// 获取楼层描述,去重
String floorDescription = data[13].trim(); // 去除空格
uniqueFloorDescriptions.add(floorDescription);
// 获取总楼层,需要将字符串转为整数类型,去重
try {
int totalFloors = Integer.parseInt(data[14].trim()); // 去除空格并转为整数
uniqueTotalFloors.add(totalFloors);
} catch (NumberFormatException e) {
// 处理无效的整数值
// 可以选择跳过或进行其他处理
// 跳过无效值并记录日志
System.err.println("Invalid total floors value: " + data[14].trim() + " at line: " + line);
continue;
}
// 获取总价格,需要将字符串转为双精度类型,去重
try {
double totalPrice = Double.parseDouble(data[2].trim()); // 去除空格并转为双精度
uniqueTotalPrices.add(totalPrice);
double unitPrice = Double.parseDouble(data[3].trim()); // 去除空格并转为双精度
uniqueUnitPrices.add(unitPrice);
} catch (NumberFormatException e) {
// 处理无效的双精度值
// 可以选择跳过或进行其他处理
// 例如:记录日志、设置默认值或报告无效值
// 在这个示例中,我们将无效值设置为0.0
System.err.println("Invalid total price value: " + data[2]);
System.err.println("Invalid unit price value: " + data[3]);
uniqueTotalPrices.add(0.0); // 设置默认值
uniqueUnitPrices.add(0.0);
}
// 创建房屋节点
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
double price = 0.0; // 默认价格,可以根据需要修改默认值
double unitPrice = 0.0; // 默认单价,可以根据需要修改默认值
try {
price = Double.parseDouble(data[2]); // 尝试将价格字段转为双精度类型
unitPrice = Double.parseDouble(data[3]);
} catch (NumberFormatException e) {
System.err.println("Invalid price value: " + data[2]);
System.err.println("Invalid unitPrice value: " + data[3]);
}
tx.run("CREATE (house:House { id: $id, address: $address, price: $price, unit_price: $unitPrice, layout: $layout, " +
"rental_area: $rentalArea, building_type: $buildingType, orientation: $orientation, decoration: $decoration, " +
"elevator_style: $elevatorCount, heating_system: $heatingMethod, transaction_type: $houseUse, " +
"property: $propertyOwnership, floor_description: $floorDescription, total_floors: $totalFloors})",
Values.parameters("id", data[0], "address", address, "price", price, "unitPrice", unitPrice,
"layout", data[4], "rentalArea", Double.parseDouble(data[5]), "buildingType", data[6], "orientation", data[7],
"decoration", data[8], "elevatorCount", data[9], "heatingMethod", data[10], "houseUse", data[11],
"propertyOwnership", data[12], "floorDescription", data[13], "totalFloors", Integer.parseInt(data[14])));
return null;
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
// 创建房屋地址节点和建立关系
for (String uniqueAddress : uniqueAddresses) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (address:Address {name: $name})", Values.parameters("name", uniqueAddress));
return null;
}
});
// 建立房屋与地址之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {address: $address}), (address:Address {name: $name}) CREATE (house)-[:LOCATED_AT]->(address)",
Values.parameters("address", uniqueAddress, "name", uniqueAddress));
return null;
}
});
}
// 创建房屋布局节点和建立房屋与布局之间的关系
for (String uniqueLayout : uniqueLayouts) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (layout:Layout {name: $name})", Values.parameters("name", uniqueLayout));
return null;
}
});
// 建立房屋与布局之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {layout: $layout}), (layout:Layout {name: $name}) CREATE (house)-[:HAS_LAYOUT]->(layout)",
Values.parameters("layout", uniqueLayout, "name", uniqueLayout));
return null;
}
});
}
// 创建建筑类型节点和建立房屋与建筑类型之间的关系
for (String uniqueBuildingType : uniqueBuildingTypes) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (buildingType:BuildingType {name: $name})", Values.parameters("name", uniqueBuildingType));
return null;
}
});
// 建立房屋与建筑类型之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {building_type: $buildingType}), (buildingType:BuildingType {name: $name}) CREATE (house)-[:HAS_BUILDING_TYPE]->(buildingType)",
Values.parameters("buildingType", uniqueBuildingType, "name", uniqueBuildingType));
return null;
}
});
}
// 创建朝向节点和建立房屋与朝向之间的关系
for (String uniqueOrientation : uniqueOrientations) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (orientation:Orientation {name: $name})", Values.parameters("name", uniqueOrientation));
return null;
}
});
// 建立房屋与朝向之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {orientation: $orientation}), (orientation:Orientation {name: $name}) CREATE (house)-[:HAS_ORIENTATION]->(orientation)",
Values.parameters("orientation", uniqueOrientation, "name", uniqueOrientation));
return null;
}
});
}
// 创建装修风格节点和建立房屋与装修风格之间的关系
for (String uniqueDecoration : uniqueDecorations) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (decoration:DecorationStyle {name: $name})", Values.parameters("name", uniqueDecoration));
return null;
}
});
// 建立房屋与装修风格之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {decoration: $decoration}), (decoration:DecorationStyle {name: $name}) CREATE (house)-[:HAS_DECORATION]->(decoration)",
Values.parameters("decoration", uniqueDecoration, "name", uniqueDecoration));
return null;
}
});
}
// 创建电梯数量节点和建立房屋与电梯数量之间的关系
for (String uniqueElevatorCount : uniqueElevatorCounts) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (elevatorCount:ElevatorCount {name: $name})", Values.parameters("name", uniqueElevatorCount));
return null;
}
});
// 建立房屋与电梯数量之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {elevator_style: $elevatorCount}), (elevatorCount:ElevatorCount {name: $name}) CREATE (house)-[:HAS_ELEVATOR_COUNT]->(elevatorCount)",
Values.parameters("elevatorCount", uniqueElevatorCount, "name", uniqueElevatorCount));
return null;
}
});
}
// 创建供暖方式节点和建立房屋与供暖方式之间的关系
for (String uniqueHeatingMethod : uniqueHeatingMethods) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (heatingMethod:HeatingMethod {name: $name})", Values.parameters("name", uniqueHeatingMethod));
return null;
}
});
// 建立房屋与供暖方式之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {heating_system: $heatingMethod}), (heatingMethod:HeatingMethod {name: $name}) CREATE (house)-[:HAS_HEATING_METHOD]->(heatingMethod)",
Values.parameters("heatingMethod", uniqueHeatingMethod, "name", uniqueHeatingMethod));
return null;
}
});
}
// 创建房屋用途节点和建立房屋与用途之间的关系
for (String uniqueHouseUse : uniqueHouseUses) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (houseUse:HouseUse {name: $name})", Values.parameters("name", uniqueHouseUse));
return null;
}
});
// 建立房屋与用途之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {use: $houseUse}), (houseUse:HouseUse {name: $name}) CREATE (house)-[:HAS_HOUSE_USE]->(houseUse)",
Values.parameters("houseUse", uniqueHouseUse, "name", uniqueHouseUse));
return null;
}
});
}
// 创建房屋产权节点和建立房屋与产权之间的关系
for (String uniquePropertyOwnership : uniquePropertyOwnerships) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (propertyOwnership:PropertyOwnership {name: $name})", Values.parameters("name", uniquePropertyOwnership));
return null;
}
});
// 建立房屋与产权之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {property: $propertyOwnership}), (propertyOwnership:PropertyOwnership {name: $name}) CREATE (house)-[:HAS_PROPERTY_OWNERSHIP]->(propertyOwnership)",
Values.parameters("propertyOwnership", uniquePropertyOwnership, "name", uniquePropertyOwnership));
return null;
}
});
}
// 创建楼层描述节点和建立房屋与楼层描述之间的关系
for (String uniqueFloorDescription : uniqueFloorDescriptions) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (floorDescription:FloorDescription {name: $name})", Values.parameters("name", uniqueFloorDescription));
return null;
}
});
// 建立房屋与楼层描述之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {floor_description: $floorDescription}), (floorDescription:FloorDescription {name: $name}) CREATE (house)-[:HAS_FLOOR_DESCRIPTION]->(floorDescription)",
Values.parameters("floorDescription", uniqueFloorDescription, "name", uniqueFloorDescription));
return null;
}
});
}
// 创建总楼层节点和建立房屋与总楼层之间的关系
for (int uniqueTotalFloor : uniqueTotalFloors) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (totalFloor:TotalFloor {level: $level})", Values.parameters("level", uniqueTotalFloor));
return null;
}
});
// 建立房屋与总楼层之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {total_floors: $totalFloor}), (totalFloor:TotalFloor {level: $level}) CREATE (house)-[:HAS_TOTAL_FLOOR]->(totalFloor)",
Values.parameters("totalFloor", uniqueTotalFloor, "level", uniqueTotalFloor));
return null;
}
});
}
// 创建总价格节点和建立房屋与价格之间的关系
for (double uniqueTotalPrice : uniqueTotalPrices) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (totalPrice:TotalPrice {amount: $amount})", Values.parameters("amount", uniqueTotalPrice));
return null;
}
});
// 建立房屋与价格之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {price: $price}), (totalPrice:TotalPrice {amount: $amount}) CREATE (house)-[:HAS_TOTAL_PRICE]->(totalPrice)",
Values.parameters("price", uniqueTotalPrice, "amount", uniqueTotalPrice));
return null;
}
});
}
// 创建单价节点和建立房屋与单价之间的关系
for (double uniqueUnitPrice : uniqueUnitPrices) {
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("CREATE (unitPrice:UnitPrice {amount: $amount})", Values.parameters("amount", uniqueUnitPrice));
return null;
}
});
// 建立房屋与单价之间的关系
session.writeTransaction(new TransactionWork<Void>() {
@Override
public Void execute(Transaction tx) {
tx.run("MATCH (house:House {unit_price: $unitPrice}), (unitPrice:UnitPrice {amount: $amount}) CREATE (house)-[:HAS_UNIT_PRICE]->(unitPrice)",
Values.parameters("unitPrice", uniqueUnitPrice, "amount", uniqueUnitPrice));
return null;
}
});
}
}
}
}
}