当前位置:   article > 正文

Neo4j数据库操作性能优化(Java)_java 操作neo4j

java 操作neo4j

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。


前言

基于上一篇,Java实现对Neo4j数据库的操作
文章链接:https://blog.csdn.net/mo_sss/article/details/132082356

基于上篇文章对neo4j数据库的操作,优化其资源创建和关闭的过程,提高数据处理的效率
其主要部分就是将资源创建放在配置类中,不去关闭资源,这样就会快很多

具体实现

1. properties文件

neo4j数据库参数读取文件neo4j.properties

neo4j.url=bolt://47.101.136.161:7687
neo4j.username=neo4j
neo4j.password=123456
  • 1
  • 2
  • 3

注:数据库地址和账号密码都是假的请根据自己的数据来配置

2. 配置类代码

Neo4jConfig.java

package com.data.config;


import lombok.Data;
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.Session;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;


/**
* @ClassDescription: neo4j数据库参数配置类
* @Author:李白
* @Date:2023/7/31 15:57
*/
@Data
@Component
//@PropertySource("neo4j.yml")
@PropertySource("neo4j.properties")
@ConfigurationProperties(prefix = "neo4j")
public class Neo4jConfig {
private String url;
   private String username;
   private String password;


@Bean
public Session neoSession() {

Driver driver = GraphDatabase.driver(url, AuthTokens.basic(username, password));
  Session session = driver.session();


       return session;
}

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

3. 工具类代码

Neo4jUtil.java

package com.data.utils.neo4j;


import com.alibaba.fastjson.JSONObject;
import com.data.config.Neo4jConfig;
import org.neo4j.driver.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;


/**
* @ClassDescription: 更快
* @Author:李白
* @Date:2023/8/14 16:01
*/
@Component
public class Neo4jUtil {
@Autowired
Session session;
   private static Session neoSession;
@PostConstruct
public void s(){
neoSession = session;
}


/**
    * 增删改接口调用(create/delete/set)
  * @param cql
  */
public static void cds(String cql){
neoSession.run(cql);
}




/**
    * 查询接口调用(match)
    * @param cql
  * @return
  */
public static List m(String cql){



Result result = neoSession.run(cql);
//        System.out.println("result: "+result);
  List list = new ArrayList();
  //获取每一个节点
  while ( result.hasNext() )

{

Record record = result.next();
//            System.out.println("record: "+record.get("n"));
//            record.get("n");
  Map<String, Object> map = record.get("n").asMap();
  Set<Entry<String, Object>> set = map.entrySet();
  JSONObject nodeProperties = new JSONObject();
  //遍历每个节点中的信息,都是key-value形式的
  for(Map.Entry one : set){

nodeProperties.put(one.getKey().toString(),one.getValue());
  System.out.print(one.getKey() + "=" + one.getValue() + ";");
  }

System.out.println();
  list.add(nodeProperties);
//            System.out.println("nodeProperties: "+nodeProperties);
  }

list.stream().sorted();
//        System.out.println(list);
  return list;
}




/**
    * 检查节点是否存在接口调用
  * @param cql
  * @return
  */
public static Boolean checkNode(String cql){

Result result = neoSession.run(cql);


       return result.hasNext();
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101

4. 请求控制类

对数据库的操作,即上篇文章中的代码中的Neo4jUtils换成Neo4jUtil即可
Neo4jController.java

package com.data.neo4j;


import com.alibaba.fastjson.JSONObject;
import com.data.neo4j.entity.UserNode;
import com.data.utils.neo4j.Neo4jUtil;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
* @ClassDescription: 请求调用-neo4j数据操作
* @Author:李白
* @Date:2023/7/31 8:27
*/
@RestController
@RequestMapping("/neo4j-part")
public class Neo4jController {


/**
    * 新增节点-用户----------------------问题:字符串直接使用需要用反斜杠转义,以变量形式填入则会报错。
  */
@PostMapping("/add")
public void add(/*@RequestParam("name")String name*/){

String name = "libai666";
  String cql = "create (u:User {name:\""+name+"\", Group:\"internal\", email:\"cx@163.com\"})";
  Neo4jUtil.cds(cql);
}


/**
    * ----------------------------------------------------新增节点-------------------------------------------------------
   */
  /**
    * 新增用户
  */
@PostMapping("/addDevice")
public void addDevice(/*@RequestParam("deviceIdPre")String deviceIdPre*/){

String deviceGroup = "internal";
  //创建二十个设备
  for (int i = 1; i < 21; i++) {
if (i<10){

String deviceIdPre = "UA000";
  String cql = "create (d:Device {deviceId:"+"\""+deviceIdPre+i+"\""+", deviceGroup:"+"\""+deviceGroup+"\""+"})";
  Neo4jUtil.cds(cql);
  }else {

String deviceIdPre = "UA00";
  String cql = "create (d:Device {deviceId:"+"\""+deviceIdPre+i+"\""+", deviceGroup:"+"\""+deviceGroup+"\""+"})";
  Neo4jUtils.cds(cql);
  }

}

}


/**
    * 新增设备
  */
@PostMapping("/addUser")
public void addUser(){
//用户信息
  UserNode un1 = new UserNode("cx","internal","cx@163.com");
  UserNode un2 = new UserNode("zzw","internal","zzw@163.com");
  UserNode un3 = new UserNode("cxl","internal","cxl@163.com");
  UserNode un4 = new UserNode("ljk","internal","ljk@163.com");
  UserNode un5 = new UserNode("bsj","internal","sj@163.com");
  UserNode un6 = new UserNode("wzw","internal","wzw@163.com");
  UserNode un7 = new UserNode("wgx","internal","wgx@163.com");
  UserNode un8 = new UserNode("jxh","internal","jxh@163.com");
  UserNode un9 = new UserNode("wt","internal","wt@163.com");
  List<UserNode> list = new ArrayList();
  list.add(un1);
  list.add(un2);
  list.add(un3);
  list.add(un4);
  list.add(un5);
  list.add(un6);
  list.add(un7);
  list.add(un8);
  list.add(un9);
  //创建9个用户
  for (int i = 0; i < list.size(); i++) {

UserNode u = list.get(i);
  String cql = "create (u:User {name:\""+u.getUserName()+"\", userGroup:\""+u.getUserGroup()+"\",email:\""+u.getEmail()+"\"})";
  Neo4jUtil.cds(cql);
  }

}


/**
    * ----------------------------------------------------查询节点-------------------------------------------------------
   */


  /**
    * 查询所有节点信息
  * @return
  */
@GetMapping("/searchAll")
public JSONObject searchAll(){

String cql = "match (n) return n";
  List m = Neo4jUtil.m(cql);
  JSONObject listJson = new JSONObject();
  listJson.put("allNodes",m);
       return listJson;
}


/**
    * 查询指定标签的所有节点信息
  * @param label 标签
  * @return
  */
@GetMapping("/searchLabelNodes")
public JSONObject searchLabelNodes(@RequestParam("label")String label){

String cql = "match (n:"+label+") return n";
  List m = Neo4jUtil.m(cql);
  JSONObject listJson = new JSONObject();
  listJson.put("labelNodes",m);
       return listJson;
}


/**
    * 查询具体的一个节点信息--查询设备具体节点
  * @param deviceId 设备号
  * @return
  */
@GetMapping("/searchOneDevice")
public JSONObject searchOneDevice(@RequestParam("deviceId")String deviceId){

String cql = "match (n:Device{deviceId:\""+deviceId+"\"}) return n";
  List m = Neo4jUtil.m(cql);
  JSONObject listJson = new JSONObject();
  listJson.put("device",m);
       return listJson;
}


/**
    * 查询具体的一个节点信息--查询设备具体节点
  * @param name 用户名
  * @return
  */
@GetMapping("/searchOneUser")
public JSONObject searchOneUser(@RequestParam("name")String name){

String cql = "match (n:User{name:\""+name+"\"}) return n";
  List m = Neo4jUtil.m(cql);
  JSONObject listJson = new JSONObject();
  listJson.put("user",m);
       return listJson;
}


/**
    * ----------------------------------------------------删除节点-------------------------------------------------------
   */
  /**
    * 删除全部节点
  */
@DeleteMapping("/deleteAllNodes")
public void deleteAllNodes(){

String cql = "match(n) delete n";
  Neo4jUtil.cds(cql);
}


/**
    * 删除同一标签的全部节点
  * @param label 标签
  */
@DeleteMapping("/deleteLabelAllNodes")
public void deleteLabelAllNodes(@RequestParam("label")String label){

String cql = "match(n:"+label+") delete n";
  Neo4jUtil.cds(cql);
}


/**
    * 删除指定的节点
  * @param name 用户名
  */
@DeleteMapping("/deleteOneUser")
public void deleteOneUser(@RequestParam("name")String name){

String cql = "match(n:User{name:\""+name+"\"}) delete n";
  Neo4jUtil.cds(cql);
}


/**
    * 删除指定的节点
  * @param deviceId 设备号
  */
@DeleteMapping("/deleteOneDevice")
public void deleteOneDevice(@RequestParam("deviceId")String deviceId){

String cql = "match(n:Device{deviceId:\""+deviceId+"\"}) delete n";
  Neo4jUtil.cds(cql);
}


/**
    * ----------------------------------------------------修改节点-------------------------------------------------------
   */
  /**
    * 根据用户名修改用户组和用户邮箱
  * @param name 用户名
  * @param userGroup 用户组
  * @param email 用户邮箱
  */
@PutMapping("/updateUser")
public void updateUser(@RequestParam("name")String name,
  @RequestParam("userGroup")String userGroup,
  @RequestParam("email")String email){

String cql = "match(n:User{name:\""+name+"\"}) set n.userGroup=\""+userGroup+"\",n.email=\""+email+"\"";
  Neo4jUtil.cds(cql);
}


/**
    * 根据deviceId修改设备组
  * @param deviceId 设备号
  * @param deviceGroup 设备组
  */
@PutMapping("/updateDevice")
public void updateDevice(@RequestParam("deviceId")String deviceId,
  @RequestParam("deviceGroup")String deviceGroup){

String cql = "match(n:Device{deviceId:\""+deviceId+"\"}) set n.deviceGroup=\""+deviceGroup+"\"";
  Neo4jUtil.cds(cql);
}




/**
    * ----------------------------------------------------创建关系-------------------------------------------------------
   */
  /**
    * 创建用户和设备之间的关系
  * @param name 用户名
  * @param deviceId 设备号
  */
@PostMapping("/createR")
public void createR(@RequestParam("name")String name,
  @RequestParam("deviceId")String deviceId){

Date date = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hhmmss");
  String dateStr = sdf.format(date);
  String cql1 = "match(u:User{name:\""+name+"\"}),(d:Device{deviceId:\""+deviceId+"\"})create (u)-[r:Borrow{date:\""+dateStr+"\"}]->(d)";
  Neo4jUtil.cds(cql1);
  String cql2 = "match(u:User{name:\""+name+"\"}),(d:Device{deviceId:\""+deviceId+"\"})create (u)<-[r:Belong{date:\""+dateStr+"\"}]-(d)";
  Neo4jUtil.cds(cql2);
}


/**
    * ----------------------------------------------------查询关系-------------------------------------------------------
   */
  /**
    * 查询指定用户名下的借用设备
  * @param name 用户名
  * @return
  */
@GetMapping("/searchU2D")
public JSONObject searchU2D(@RequestParam("name")String name){

JSONObject u2dJson = new JSONObject();
  String cql = "match(u:User{name:\""+name+"\"})-[r:Borrow]->(n) return n";
  List m = Neo4jUtil.m(cql);
  u2dJson.put("u2dList",m);
       return u2dJson;
}


/**
    * 查询指定设备的使用用户列表
  * @param deviceId 设备号
  * @return
  */
@GetMapping("/searchD2U")
public JSONObject searchD2U(@RequestParam("deviceId")String deviceId){

JSONObject d2uJson = new JSONObject();
  String cql = "match(d:Device{deviceId:\""+deviceId+"\"})-[r:Belong]->(n) return n";
  List m = Neo4jUtil.m(cql);
  d2uJson.put("d2uList",m);
       return d2uJson;
}


/**
    * ----------------------------------------------------删除关系-------------------------------------------------------
   */
  /**
    * 删除指定用户与指定设备的关系
  * @param name 用户名
  * @param deviceId 设备号
  */
@DeleteMapping("/deleteU2DR")
public void deleteU2DR(@RequestParam("name")String name,
  @RequestParam("deviceId")String deviceId){

String cql1 = "match(u:User{name:\""+name+"\"})-[r:Borrow]->(d:Device{deviceId:\""+deviceId+"\"}) delete r";
  String cql2 = "match(u:User{name:\""+name+"\"})<-[r:Belong]-(d:Device{deviceId:\""+deviceId+"\"}) delete r";
  Neo4jUtil.cds(cql1);
  Neo4jUtil.cds(cql2);
}


/**
    * 删除指定用户与所有设备的关系
  * @param name 用户名
  */
@DeleteMapping("/deleteU2AllDR")
public void deleteU2AllDR(@RequestParam("name")String name){

String cql1 = "match(u:User{name:\""+name+"\"})-[r:Borrow]->(d:Device) delete r";
  String cql2 = "match(u:User{name:\""+name+"\"})<-[r:Belong]-(d:Device) delete r";
  Neo4jUtil.cds(cql1);
  Neo4jUtil.cds(cql2);
}


/**
    * 删除指定设备与所有用户的关系
  * @param deviceId 设备号
  */
@DeleteMapping("/deleteD2AllUR")
public void deleteD2AllUR(@RequestParam("deviceId")String deviceId){

String cql1 = "match(u:User)-[r:Borrow]->(d:Device{deviceId:\""+deviceId+"\"}) delete r";
  String cql2 = "match(u:User)<-[r:Belong]-(d:Device{deviceId:\""+deviceId+"\"}) delete r";
  Neo4jUtil.cds(cql1);
  Neo4jUtil.cds(cql2);
}




/**
    * ----------------------------------------------------修改关系-------------------------------------------------------
   */
  /**
    * 修改指定用户与指定设备的关系
  * @param name 用户名
  * @param deviceId 设备号
  * @param expire 设备借用时间
  */
@PutMapping("/updateU2DR")
public void updateU2DR(@RequestParam("name")String name,
  @RequestParam("deviceId")String deviceId,
  @RequestParam("expire")String expire){

String cql1 = "match(u:User{name:\""+name+"\"})-[r:Borrow]->(d:Device{deviceId:\""+deviceId+"\"}) set r.date=\""+expire+"\"";
  String cql2 = "match(u:User{name:\""+name+"\"})<-[r:Belong]-(d:Device{deviceId:\""+deviceId+"\"}) set  r.date=\""+expire+"\"";
  Neo4jUtil.cds(cql1);
  Neo4jUtil.cds(cql2);
}


/**
    * 修改指定用户与所有设备的关系
  * @param name 用户名
  * @param expire 设备借用时间
  */
@PutMapping("/updateU2AllDR")
public void updateU2AllDR(@RequestParam("name")String name,
  @RequestParam("expire")String expire){

String cql1 = "match(u:User{name:\""+name+"\"})-[r:Borrow]->(d) set r.date=\""+expire+"\"";
  String cql2 = "match(u:User{name:\""+name+"\"})<-[r:Belong]-(d) set  r.date=\""+expire+"\"";
  Neo4jUtil.cds(cql1);
  Neo4jUtil.cds(cql2);
}


/**
    * 修改指定设备与所有用户的关系
  * @param deviceId 设备号
  * @param expire 设备借用时间
  */
@PutMapping("/updateD2AllUR")
public void updateD2AllUR(@RequestParam("deviceId")String deviceId,
  @RequestParam("expire")String expire){

String cql1 = "match(u)-[r:Borrow]->(d:Device{deviceId:\""+deviceId+"\"}) set r.date=\""+expire+"\"";
  String cql2 = "match(u)<-[r:Belong]-(d:Device{deviceId:\""+deviceId+"\"}) set  r.date=\""+expire+"\"";
  Neo4jUtil.cds(cql1);
  Neo4jUtil.cds(cql2);
}



}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • 403
  • 404
  • 405
  • 406
  • 407
  • 408
  • 409
  • 410
  • 411
  • 412
  • 413
  • 414
  • 415

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/1013642
推荐阅读
相关标签
  

闽ICP备14008679号