本指南将引导您完成使用SpringDataNeo4j构建应用程序的过程,该应用程序在Neo4j中存储和检索数据,Neo4j是一个基于图形的数据库。您将构建什么您将使用Neo4j的NoSQL基于图形的数据存储来构建嵌入式Neo4j服务器、存储实体和关系以及开发查询。你需要什么大约15分钟最喜欢的文本编辑器或IDEJDK1.8或更高版本Gradle4+或Maven3.2+你也可以直接将代码导入IDE:SpringToolSuite(STS)IntelliJIDEA如何完成本指南最喜欢最喜欢Spring入门指南,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。要从头开始,请继续使用SpringInitializr。跳过基础知识:下载并解压缩本指南的源代码存储库,或使用Git克隆它:gitclonehttps://github.com/spring-guides/gs-accessing-data-neo4j.gitCD进入gs-accessing-data-neo4j/initial跳转到定义一个简单的实体。完成后,您可以根据gs-accessing-data-neo4j/complete中的代码检查结果。从SpringInitializr开始,您可以使用这个预初始化的项目并单击生成以下载ZIP文件。该项目配置为适合本教程中的示例。手动初始化项目:导航到https://start.spring.io。该服务会引入您的应用程序所需的所有依赖项,并为您完成大部分设置。选择Gradle或Maven以及您要使用的语言。本指南假设您选择了Java。单击依赖项并选择SpringDataNeo4j。单击生成。下载生成的ZIP文件,它是根据您的选择配置的Web应用程序的存档。如果您的IDE集成了SpringInitializr,您可以从IDE中完成此过程。您还可以从Github中fork项目并在您的IDE或其他编辑器中打开它。设置Neo4j服务器在构建这个应用程序之前,您需要设置Neo4j服务器。Neo4j有一个开源服务器,您可以免费安装。在安装了Homebrew的Mac上,运行以下命令:$brewinstallneo4j有关其他选项,请访问https://neo4j.com/download/community-edition/。安装后,通过运行以下命令以默认设置启动它:$neo4jstart您应该看到类似于以下内容的输出:startingNeo4j。启动neo4j(pid96416)。默认情况下,它位于http://localhost:7474/服务器准备就绪之前可能会有短暂的延迟。有关当前状态,请参阅/usr/local/Cellar/neo4j/3.0.6/libexec/logs/neo4j.log。默认情况下,Neo4j用户名和密码是neo4j和neo4j。但是,它需要更改新帐户密码。为此,请运行以下命令:curl-v-uneo4j:neo4jPOSTlocalhost:7474/user/neo4j/password-H"Content-type:application/json"-d"{\"password\":\"secret\"}"这会将密码从neo4j更改为secret-在生产环境中不要这样做!完成此步骤后,您应该准备好运行本指南的其余部分。定义简单实体Neo4j捕获实体及其关系,这两个方面同样重要。想象一下,您正在为一个存储每个人的记录的系统建模。但是,您还想跟踪一个人的同事(在本例中为队友)。使用SpringDataNeo4j,您可以使用一些简单的注解来获取所有这些,如下清单(在中src/main/java/com/example/accessingdataneo4j/Person.java)所示:packagecom.example.accessingdataneo4j;importjava.util.Collections;导入java.util.HashSet;导入java.util.Optional;导入java.util.Set;导入java.util.stream.Collectors;导入org.springframework.data.neo4j.core.schema.Id;导入org.springframework.data.neo4j.core.schema.Node;导入org.springframework.data.neo4j.core.schema.Property;导入org.springframework.data.neo4j.core.schema.Relationship;导入org.springframework.data.neo4j.core.schema.GeneratedValue;@NodepublicclassPerson{@Id@GeneratedValueprivateLongid;私有字符串名称;privatePerson(){//从Neo4jAPI2.0.5开始需要空构造函数};publicPerson(Stringname){this.name=name;}/***Neo4j并没有真正的双向关系。它只是意味着在查询*时忽略关系的方向。*https://dzone.com/articles/modelling-data-neo4j*/@Relationship(type="TEAMMATE")publicSet队友;publicvoidworksWith(Personperson){if(teammates==null){teammates=newHashSet<>();}teammates.add(person);}publicStringtoString(){returnthis.name+"'steammates=>"+Optional.ofNullable(this.teammates).orElse(Collections.emptySet()).stream().map(Person::getName)。收集(收集器。toList());}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;在这里,你有一个只有一个属性的Person类:name。当类Person使用注解@NodeEntityNeo4j存储它时,将创建一个新节点。这个类还有一个id标签@GraphId。Neo4j在内部使用@GraphId来跟踪数据。下一个重要的部分是队友。它只是简单的Set,但被标记为@Relationship。这意味着该集合的每个成员都应作为单独的Person节点存在。请注意方向是如何设置为UNDIRECTED的。这意味着当您查询TEAMMATE关系时,SpringDataNeo4j会忽略关系的方向。使用worksWith()方法,您可以轻松地将人们联系在一起。最后,您有一个方便的toString()方法可以打印出此人的姓名和此人的同事。创建简单查询SpringDataNeo4j专注于在Neo4j中存储数据。但它继承了SpringDataCommons项目的功能,包括派生查询的能力。本质上,您不需要学习Neo4j的查询语言。相反,您可以编写一些方法,让查询为您编写。要查看其工作原理,请创建一个查询Person节点的接口。以下清单(insrc/main/java/com/example/accessingdataneo4j/PersonRepository.java)显示了这样一个查询:packagecom.example.accessingdataneo4j;importjava.util.List;importorg.springframework.data.neo4j.repository。Neo4jRepository;publicinterfacePersonRepositoryextendsNeo4jRepository{PersonfindByName(Stringname);ListfindByTeammatesName(Stringname);}PersonRepository扩展Neo4jRepository接口并插入其操作类型:Person。该接口带有许多操作,包括标准的CRUD(创建、读取、更新和删除)操作。但是您可以通过声明它们的方法签名来定义其他查询。在本例中,您添加了findByName以查找类型为Person的节点并找到与名称匹配的节点。您还有findByTeammatesName,它会查找Person节点,并根据队友的姓名向下钻取到队友字段中的每个条目。访问Neo4j权限Neo4j社区版需要凭据才能访问它。您可以通过设置一些属性(在src/main/resources/application.properties中)来配置这些凭据,如以下清单所示:spring.neo4j.uri=bolt://localhost:7687spring.data.neo4j.username=neo4jspring.data.neo4j.password=secret这包括我们之前选择的默认用户名(neo4j)和新设置的密码(secret)。不要将真实凭证存储在源存储库中。相反,使用SpringBoot的属性覆盖在运行时配置它们。创建应用程序类SpringInitializr为应用程序创建一个简单的类。以下清单显示了Initializr为此示例创建的类(在src/main/java/com/example/accessingdataneo4j/AccessingDataNeo4jApplication.java中):springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication公共类AccessingDataNeo4jApplication{publicstaticvoidmain(String[]args){SpringApplication.run(AccessingDataNeo4jApplication.class,args);@SpringBootApplication是一个方便的注释,它添加了以下所有内容:@Configuration:将类标记为应用程序上下文的bean定义源。@EnableAutoConfiguration:告诉SpringBoot开始添加基于类路径设置、其他bean和各种属性设置的bean。例如,如果spring-webmvc在classpath上,则此注解将应用程序标记为Web应用程序并激活关键行为,例如设置DispatcherServlet。@ComponentScan:告诉Spring在包com/example中查找其他组件、配置和服务,让它找到控制器。main()方法使用SpringBoot的SpringApplication.run()方法来启动应用程序。您是否注意到没有一行XML?也没有web.xml文件。Web应用程序是100%纯Java,您无需处理任何管道或基础设施配置。只要它们包含在@SpringBootApplication类的同一个包(或子包)中,SpringBoot就会自动处理这些存储库。为了更好地控制注册过程,您可以使用@EnableNeo4jRepositories注释。默认情况下,@EnableNeo4jRepositories扫描当前包以查找任何扩展SpringData存储库接口之一的接口。如果您的项目布局有多个项目并且找不到您的存储库,您可以使用basePackageClasses=MyRepository.class安全地告诉SpringDataNeo4j按类型扫描不同的根包。显示日志输出。该服务应在几秒钟内启动并运行。PersonRepository现在自动装配您之前定义的实例。SpringDataNeo4j动态实现接口并插入所需的查询代码以满足接口的义务。main方法使用SpringBootSpringApplication.run()启动应用程序并调用CommandLineRunner方法来建立关系。在此示例中,您将创建三个本地Person实例:Greg、Roy和Craig。最初,它们仅存在于内存中。请注意,没有人是任何人的队友(目前)。一开始,你找到Greg,透露他与Roy和Craig组队,然后再次与他保持联系。请记住,队友关系被标记为UNDIRECTED(即双向)。这意味着Roy和Craig也得到了更新。这就是为什么您需要更新Roy。首先从Neo4j获取该记录至关重要。在将Craig添加到列表之前,您需要了解Roy队友的最新状态。为什么没有获取Craig和添加任何关系的代码?因为你已经拥有了!格雷格早些时候将克雷格标记为队友,罗伊也是如此。这意味着无需再次更新Craig的关系。当您遍历每个团队成员并将他们的信息打印到控制台时,您可以看到它。最后,查看您正在寻找的其他查询,以回答“谁与谁一起工作?”的问题。以下清单显示了已完成的AccessingDataNeo4jApplication类(atsrc/main/java/com/example/accessingdataneo4j/AccessingDataNeo4jApplication.java):packagecom.example.accessingdataneo4j;importjava.util.Arrays;importjava.util.List;importorg.slf4j.Logger;导入org.slf4j.LoggerFactory;导入org.springframework.boot.CommandLineRunner;导入org.springframework.boot.SpringApplication;导入org.springframework.boot.autoconfigure.SpringBootApplication;导入org.springframework.context.annotation.Bean;导入org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;@SpringBootApplication@EnableNeo4jRepositoriespublicclassAccessingDataNeo4jApplication{privatefinalstaticLoggerlog=LoggerFactory.getLogger(AccessingDataNeo4jApplication.class);publicstaticvoidmain(String[]args)throwsException{SpringApplication.run(AccessingDataNeo4jApplication.class,args);系统.exit(0);}@BeanCommandLineRunner演示(PersonRepositorypersonRepository){returnargs->{personRepository.deleteAll();Persongreg=newPerson("Greg");人roy=newPerson("Roy");Personcraig=newPerson("Craig");Listteam=Arrays.asList(greg,roy,craig);log.info("在连接Neo4j之前...");team.stream().forEach(person->log.info("\t"+person.toString()));personRepository.save(格雷格);personRepository.save(罗伊);personRepository.save(克雷格);greg=personRepository.findByName(greg.getName());greg.worksWith(罗伊);greg.worksWith(克雷格);personRepository.save(格雷格);roy=personRepository.findByName(roy.getName());roy.worksWith(克雷格);//我们已经知道roy与gregpersonRepository.save(roy)一起工作;//我们已经知道craig与roy和greg一起工作log.info("Lookupeachpersonbyname...");team.stream().forEach(person->log.info("\t"+personRepository.findByName(person.getName()).toString()));List队友=personRepository.findByTeammatesName(greg.getName());log.info("以下有Greg作为队友...");teammates.stream().forEach(person->log.info("\t"+person.getName()));};}}构建一个可执行JAR,您可以使用Gradle或Maven应用程序从命令行运行您还可以构建一个包含所有必要依赖项、类和资源的单个可执行JAR文件并运行它。构建可执行jar使得在整个开发生命周期、跨不同环境等的应用程序中交付、版本化和部署服务变得容易。如果你使用Gradle,你可以使用./gradlewbootRun。或者,您可以使用./gradlewbuild构建JAR文件,然后按如下方式运行JAR文件:java-jarbuild/libs/gs-accessing-data-neo4j-0.1.0.jar如果您使用Maven,则可以使用./mvnw弹簧启动:运行。或者,您可以使用./mvnwcleanpackage构建JAR文件,然后运行??JAR文件,如下所示:java-jartarget/gs-accessing-data-neo4j-0.1.0.jar此处描述的步骤创建一个可运行的JAR.您还可以构建经典WAR文件。您应该看到类似于以下列表的内容(以及其他类似查询的内容):在连接Neo4j之前...Greg的队友=>[]Roy的队友=>[]Craig的队友=>[]按名字查找每个人...Greg的teammates=>[Roy,??Craig]Roy'steammates=>[Greg,Craig]Craig'steammates=>[Roy,Greg]你可以从输出中看到(最初)没有人通过任何关系连接起来。然后,在您添加人员后,他们将捆绑在一起。最后,您可以看到一个方便的查询,可以根据队友查找人员。总结恭喜!您刚刚设置了一个嵌入式Neo4j服务器,存储了一些简单的相关实体,并开发了一些快速查询。