一、Neo4j数据库访问

1、Neo4j数据库访问

  • 嵌入式数据库
  • 服务器模式(通过REST的访问)

它是由应用程序的性质(neo4j是独立服务器 还是和程序在一起),性能,监控和数据安全性来决定架构选择。

2、An embedded database(嵌入式数据库)

嵌入式Neo4j数据库是性能的最佳选择。 通过指定数据存储的路径以编程方式访问嵌入式数据库。我们选择嵌入式数据库出于以下原因:
使用Java作为我们项目的编程语言时

  • 应用程序是独立的
  • 程序追求很高的性能

3、Neo4j Server(服务器模式)

Neo4j Server是相互操作性,安全性和监控的最佳选择。 实际上,REST接口允许所有现代平台和编程语言与它进行互操作。 此外,作为独立应用程序,它比嵌入式配置更安全(客户端中的潜在故障不会影响服务器),并且更易于监控。 如果我们选择使用这种模式,我们的应用程序将充当Neo4j服务器的客户端。要连接到Neo4j服务器,可以使用任何编程语言的REST 访问数据库。

二、Java客户端操作Neo4j

1、嵌入式模式

<dependency><groupId>org.neo4j</groupId><artifactId>neo4j</artifactId><version>3.5.5</version>
</dependency>
public class EmbeddedNeo4jAdd {private static final File databaseDirectory = new File( "target/graph.db" );public static void main(String[] args) {GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(databaseDirectory);System.out.println("Database Load!");Transaction tx = graphDb.beginTx();Node n1 = graphDb.createNode();n1.setProperty("name", "张三");n1.setProperty("character", "A");n1.setProperty("gender",1);n1.setProperty("money", 1101);n1.addLabel(new Label() {@Overridepublic String name() {return "Person";}});String cql = "CREATE (p:Person{name:'李四',character:'B',gender:1,money:21000})";graphDb.execute(cql);tx.success();tx.close();System.out.println("Database Shutdown!");graphDb.shutdown();}
}
public class EmbeddedNeo4jQueryAll {private static final File databaseDirectory = new File( "target/graph.db" );public static void main(String[] args) {GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(databaseDirectory);System.out.println("Database Load!");String cql = "MATCH (a:Person) where a.money < $money return a";Map<String, Object> paramerters = new HashMap<String, Object>();paramerters.put("money", 25000);Transaction tx = graphDb.beginTx();Result result = graphDb.execute(cql,paramerters);while (result.hasNext()) {Map<String, Object> row = result.next();for (String key : result.columns()) {Node nd = (Node) row.get(key);System.out.printf("%s = %s:%s%n", key,nd.getProperty("name"),nd.getProperty("money"));}} tx.success();tx.close();System.out.println("Database Shutdown!");graphDb.shutdown();}
}

2、服务器模式

<dependency><groupId>org.neo4j</groupId><artifactId>neo4j-ogm-bolt-driver</artifactId><version>3.2.10</version>
</dependency>
public class Neo4jServerMain {public static void main(String[] args) {Driver driver = GraphDatabase.driver( "bolt://127.0.0.1:7687",AuthTokens.basic( "neo4j", "123456" ) );Session session = driver.session();String cql = "MATCH (a:Person) WHERE a.money > $money " +"RETURN a.name AS name, a.money AS money order by a.money ";Result result = session.run( cql,parameters( "money", 1000 ) );while ( result.hasNext() ){Record record = result.next();System.out.println( record.get( "name" ).asString() + " " +record.get( "money" ).asDouble() );} session.close();driver.close();}
}
public class Neo4jServerMain2 {public static void main(String[] args) {Driver driver = GraphDatabase.driver( "bolt://127.0.0.1:7687",AuthTokens.basic( "neo4j", "123456" ) );Session session = driver.session();String cql = "MATCH p=shortestPath((person:Person {name:$startName})-[*]-(person2:Person {name:$endName} )) RETURN p";Result result = session.run( cql,parameters("startName","王启年","endName","九品射手燕小乙") );while ( result.hasNext() ){Record record = result.next();System.out.println(record);} session.close();driver.close();}
}

三、SpringBoot 整合Neo4j

1、导入jar

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
<dependency><groupId>org.neo4j</groupId><artifactId>neo4j-ogm-bolt-driver</artifactId>
</dependency>

2、建立实体类

@NodeEntity
public class Person {@Id@GeneratedValueprivate Long  id;@Property("cid")private int   pid;private String name;private String  character;private double  money;private int   age;private String description;@Relationship(type = "Friends",direction = Relationship.OUTGOING)private Set<Person>  friendsPerson;public Set<Person> getFriendsPerson() {return friendsPerson;}public void setFriendsPerson(Set<Person> friendsPerson) {this.friendsPerson = friendsPerson;}public Person(Long id, int pid, String name, String character, double money, int age, String description) {this.id = id;this.pid = pid;this.name = name;this.character = character;this.money = money;this.age = age;this.description = description;}public Person() {}public Long getId() {return id;}@Overridepublic String toString() {return "Person{" +"id=" + id +", pid=" + pid +", name='" + name + '\'' +", character='" + character + '\'' +", money=" + money +", age=" + age +", description='" + description + '\'' +", friendsPerson=" + friendsPerson +'}';}public void setId(Long id) {this.id = id;}public int getPid() {return pid;}public void setPid(int pid) {this.pid = pid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCharacter() {return character;}public void setCharacter(String character) {this.character = character;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}
}

3、数据持久层

@Repository
public interface PersonRepository extends Neo4jRepository<Person,Long> {/** 查看money 大于指定值的Person 列表 *///@Query("match(p:Person) where p.money>{0} return p")@Query("match(p:Person) where p.money>{money} return p")List<Person>   personList(@Param("money") double money);/** 指定开始的名字 和 结束的名字 查询最短路径  限定深度为4以层包含4*/@Query("match p=shortestPath((person:Person{name:{startName}})-[*1..4]-(person2:Person {name:{endName}})) return p")List<Person>   shortestPath(@Param("startName") String startName,@Param("endName") String endName);@Query("match p =(person:Person {name:{name}})-[*1..2]-(:Person) return p")List<Person>   personListDept(@Param("name") String name);
}

4、配置文件 application.yml

spring:data:neo4j:username: neo4jpassword: 123456uri:  bolt://localhost:7687

5、编写服务类

@Service("personService")
public class Neo4jPersonService {@Autowiredprivate PersonRepository personRepository;public List<Person>  getAll(){List<Person>  datas = new ArrayList<>();personRepository.findAll().forEach(person -> datas.add(person));return  datas;}public  Person  save(Person person){return  personRepository.save(person);}public  List<Person>  personList(double money){return  personRepository.personList(money);}public List<Person> shortestPath(String startName,String endName){return personRepository.shortestPath(startName,endName);}public  List<Person> personListDept(String name){return  personRepository.personListDept(name);}}

6、编写测试类

@SpringBootApplication
public class Neo4jBootAppMain {public static void main(String[] args) {ApplicationContext  applicationContext = SpringApplication.run(Neo4jBootAppMain.class,args);Neo4jPersonService  personService = applicationContext.getBean("personService",Neo4jPersonService.class);Person  person = new Person();person.setName("testboot");person.setMoney(12345.45);person.setCharacter("A");person.setAge(11);Person p1 = personService.save(person);System.out.println(p1);System.out.println(personService.getAll());List<Person>  personList = personService.personList(1000);System.out.println(personList);List<Person>  personList2 = personService.shortestPath("王启年","九品射手燕小乙");System.out.println(personList2);List<Person> personList3 = personService.personListDept("范闲");for (Person pe:personList3){System.out.println(pe);}}
}

Neo4j的两种方式访问(嵌入式访问、服务器模式访问)-- java客户端连接和SpringBoot整合Neo4j相关推荐

  1. Nginx配置同一个域名同时支持http与https两种方式访问

    Nginx配置同一个域名http与https两种方式都可访问,证书是阿里云上免费申请的 server { listen 80; listen 443 ssl; ssl on; server_name ...

  2. Java面试题:synchronized和对象的访问定位的两种方式

    说一说自己对于 synchronized 关键字的理解 ? synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者 代码块在任意时 ...

  3. Java常见面试题:对象的访问定位的两种方式

    对象的访问定位的两种方式 java对象在访问的时候,我们需要通过java虚拟机栈的reference类型的数据去操作具体的对象. 由于reference类型在java虚拟机规范中只规定了一个对象的引用 ...

  4. 关于虚拟机中对象访问定位的两种方式的一些思考

    前言 本文是在周志明老师经典作品<深入理解Java虚拟机>第二章第三节的基础上对句柄和直接指针两种对象访问方式的深入思考,有不准确的地方希望读者不吝赐教. JVM中访问对象的两种方式 1. ...

  5. 美国人在家用计算机访问网络,美国人在家里请客往往有两种方式

    第一:邀请与应邀礼仪 美国人请客多用电话或当面提出,请帖上将列明日期.时间.地点和聚会的性质,接到邀请通常是要答复的,如果不当面亲口答复,写一个短柬或打电话即可.在美国,人们习惯上除非真正打算应约参加 ...

  6. Python操作Neo4j图数据库的两种方式

    Python操作Neo4j图数据库的两种方式 前言 1. 用neo4j模块执行CQL ( cypher ) 语句 2. 用py2neo模块通过操作python变量,达到操作neo4j的目的 3. 用p ...

  7. Eclipse安装SVN插件的两种方式

    登录 | 注册 收藏成功 确定 收藏失败,请重新收藏 确定 查看所有私信查看所有通知 暂没有新通知 想要绕过微信小程序开发中的坑吗?不妨来听这个,今晚8点,1小时帮你搞定! 23小时以前 CSDN日报 ...

  8. sock 文件方式控制宿主机_nginx与php-fpm通信的两种方式

    简述 在linux中,nginx服务器和php-fpm可以通过tcp socket和unix socket两种方式实现. unix socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数 ...

  9. mysql不停止重启服务器_不停止MySQL服务增加从库的两种方式

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

最新文章

  1. c语言派,C语言中 派/4=1-1/3+1/5-1/7....公式求派
  2. Java学习开发入门基础教程系列
  3. Java技术:实现pdf和Excel的生成及数据动态插入、导出
  4. SQL Server 锁升级阈值
  5. windows 2003 网络负载平衡设置实战
  6. 安装gunicorn
  7. 矩阵特征值的求解例子
  8. android局域网设备查看器,局域网查看工具(LanSee)
  9. win10软件拒绝访问删不掉_文件拒绝访问,详细教您win10文件访问被拒绝怎么解决...
  10. 蜻蜓FM 涉嫌诈骗投资人和广告主源代码剖析
  11. 记录一个非常实用的gif制作工具licecap
  12. OpenCV:对图像的位操作bitwise_and(与),bitwise_or(或),bitwise_not(非),bitwise_xor(异或)
  13. 高级密码学复习1-HUST版
  14. 815. 打印字符串
  15. 2022年“研究生科研素养提升”系列公益讲座在线测评【2】
  16. Win10隐藏状态栏图标的方法
  17. 1123: [POI2008]BLO
  18. Python常用库 - 【持续整理归档】
  19. 菜刀php后门,关于菜刀后门排查
  20. Python netmiko库实现huawei/h3c网络设备配置

热门文章

  1. java executeupdate_执行完executeUpdate()方法…-体系课
  2. hive中Buckets详解
  3. DP56 打家劫舍(三)
  4. Android service的两种使用方式bindService和startService使用方式
  5. 邮件退信 搞定 (spamhaus 反垃圾组织黑名单CBL申诉图文)
  6. 最可贵的努力,是选择一个正确的方向
  7. JavaScript(完结)
  8. linux随机删除指定文件夹中的部分数据
  9. FPC的发展及应用,软板行业未来将持续增长
  10. 我天天加班,被辞退了:比平庸更可怕的是瞎努力