原文
https://spring.io/guides/gs/accessing-neo4j-data-rest/
直译
启动Neo4j服务器
在构建此应用程序之前,您需要设置Neo4j服务器。
Neo4j有一个可以免费安装的开源服务器:
在Mac上,只需输入:
$ brew install neo4j
有关其他选项,请访问https://neo4j.com/download/community-edition/
安装后,使用默认设置启动它:
$ neo4j start
你应该看到这样的消息:
Starting Neo4j.
Started neo4j (pid 96416). By default, it is available at http://localhost:7474/
There may be a short delay until the server is ready.
See /usr/local/Cellar/neo4j/3.0.6/libexec/logs/neo4j.log for current status.
默认情况下,Neo4j的用户名/密码为neo4j / neo4j。但是,它需要更改新的帐户密码。为此,请执行以下命令:
$ curl -v -u neo4j:neo4j -X POST localhost:7474 / user / neo4j / password -H“Content-type:application / json”-d“{\”password \“:\”secret \“}”
这会将密码从neo4j更改为secret(生产中的某些内容!)完成后,您应该已准备好运行本指南。
创建域对象
创建一个新的域对象来呈现一个人。
src/main/java/hello/Person.java
package hello;
import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;
@NodeEntity
public class Person {
@Id @GeneratedValue private Long id;
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
它Person有一个名字和一个姓氏。还有一个id对象,配置为自动生成,因此您不必处理它。
访问Neo4j的权限
Neo4j Community Edition需要凭据才能访问它。这可以配置一些属性。
include complete/src/main/resources/application.properties[]
这包括默认用户名neo4j和secret我们之前选择的新设置密码。
不要在源存储库中存储真实凭据。而是使用Spring Boot的属性覆盖在运行时中配置它们。
有了这个,让我们把它连接起来看看它的样子!
创建一个Person存储库
接下来,您需要创建一个简单的存储库。
src/main/java/hello/PersonRepository.java
package hello;
import java.util.List;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
List<Person> findByLastName(@Param("name") String name);
}
此存储库是一个接口,允许您执行涉及Person对象的各种操作。它通过扩展Spring Data Commons中定义的PagingAndSortingRepositry接口来获取这些操作。
在运行时,Spring Data REST将自动创建此接口的实现。然后它将使用@RepositoryRestResource批注指导Spring MVC创建RESTful端点/people。
@RepositoryRestResource导出存储库不是必需的。它仅用于更改导出详细信息,例如使用/people而不是使用默认值/persons。
在这里,您还定义了一个自定义查询,以Person根据lastName 检索对象列表。您将在本指南中看到如何进一步调用它。
使应用程序可执行
虽然可以将此服务打包为传统的WAR文件以部署到外部应用程序服务器,但下面演示的更简单的方法创建了一个独立的应用程序。您将所有内容打包在一个可执行的JAR文件中,由一个好的旧Java main()方法驱动。在此过程中,您使用Spring的支持将Tomcat servlet容器嵌入为HTTP运行时,而不是部署到外部实例。
src/main/java/hello/Application.java
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@EnableNeo4jRepositories
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication 是一个便利注释,添加了以下所有内容:
-
@Configuration 标记该类作为应用程序上下文的bean定义的来源。
-
@EnableAutoConfiguration 告诉Spring Boot开始根据类路径设置,其他bean和各种属性设置添加bean。
-
通常你会添加@EnableWebMvc一个Spring MVC应用程序,但Spring Boot会在类路径上看到spring-webmvc时自动添加它。这会将应用程序标记为Web应用程序并激活关键行为,例如设置a DispatcherServlet。
-
@ComponentScan告诉Spring在包中寻找其他组件,配置和服务hello,允许它找到控制器。
该main()方法使用Spring Boot的SpringApplication.run()方法启动应用程序。您是否注意到没有一行XML?也没有web.xml文件。此Web应用程序是100%纯Java,您无需处理配置任何管道或基础结构。
该@EnableNeo4jRepositories注释激活春季数据Neo4j的。Spring Data Neo4j将创建一个具体的实现,PersonRepository并将其配置为使用Cypher查询语言与嵌入式Neo4j数据库通信。
构建可执行的JAR
您可以使用Gradle或Maven从命令行运行该应用程序。或者,您可以构建一个包含所有必需依赖项,类和资源的可执行JAR文件,并运行该文件。这使得在整个开发生命周期中,跨不同环境等将服务作为应用程序发布,版本和部署变得容易。
如果您使用的是Gradle,则可以使用./gradlew bootRun。或者您可以使用构建JAR文件./gradlew build。然后你可以运行JAR文件:
java -jar build / libs / gs-access-neo4j-data-rest-0.1.0.jar
如果您使用的是Maven,则可以使用该应用程序运行该应用程序./mvnw spring-boot:run。或者您可以使用构建JAR文件./mvnw clean package。然后你可以运行JAR文件:
java -jar target / gs-access-neo4j-data-rest-0.1.0.jar
上面的过程将创建一个可运行的JAR。您也可以选择构建经典WAR文件。
显示记录输出。该服务应在几秒钟内启动并运行。
测试应用程序
现在应用程序正在运行,您可以测试它。您可以使用任何您想要的REST客户端。以下示例使用* nix工具curl。
首先,您希望看到顶级服务。
$ curl http://localhost:8080
{
"_links" : {
"people" : {
"href" : "http://localhost:8080/people{?page,size,sort}",
"templated" : true
}
}
}
在这里,您可以第一眼看到该服务器提供的功能。位于http:// localhost:8080 / people的人员链接。它有一些选项,比如,和。?page?size?sort
Spring Data REST使用HAL格式进行JSON输出。它非常灵活,可以方便地提供与所服务数据相邻的链接。
$ curl http://localhost:8080/people
{
"_links" : {
"self" : {
"href" : "http://localhost:8080/people{?page,size,sort}",
"templated" : true
},
"search" : {
"href" : "http://localhost:8080/people/search"
}
},
"page" : {
"size" : 20,
"totalElements" : 0,
"totalPages" : 0,
"number" : 0
}
}
目前没有元素,因此没有页面。是时候创造新的了Person!
$ curl -i -X POST -H "Content-Type:application/json" -d '{ "firstName" : "Frodo", "lastName" : "Baggins" }' http://localhost:8080/people
HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
Location: http://localhost:8080/people/0
Content-Length: 0
Date: Wed, 26 Feb 2014 20:26:55 GMT
-i确保您可以看到包含标题的响应消息。新创建的URI Person被示出
-X POST信号这是一个POST用于创建新条目
-H “Content-Type:application/json” 设置内容类型,以便应用程序知道有效负载包含JSON对象
-d ‘{ “firstName” : “Frodo”, “lastName” : “Baggins” }’ 是正在发送的数据
注意前一个POST操作如何包含Location标题。它包含新创建的资源的URI。春季数据REST也有两种方法RepositoryRestConfiguration.setReturnBodyOnCreate(…),并setReturnBodyOnCreate(…)您可以使用它来配置框架立即返回刚刚创建的资源的表示。
从这里你可以查询所有人:
$ curl http://localhost:8080/people
{
"_links" : {
"self" : {
"href" : "http://localhost:8080/people{?page,size,sort}",
"templated" : true
},
"search" : {
"href" : "http://localhost:8080/people/search"
}
},
"_embedded" : {
"people" : [ {
"firstName" : "Frodo",
"lastName" : "Baggins",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/0"
}
}
} ]
},
"page" : {
"size" : 20,
"totalElements" : 1,
"totalPages" : 1,
"number" : 0
}
}
该人对象包含与佛罗多的列表。请注意它是如何包含自我链接的。Spring Data REST还使用Evo Inflector来复制实体的名称以进行分组。
您可以直接查询单个记录:
$ curl http://localhost:8080/people/0
{
"firstName" : "Frodo",
"lastName" : "Baggins",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/0"
}
}
}
这可能看起来纯粹基于网络,但在幕后,有一个嵌入式Neo4j图形数据库。在生产中,您可能会连接到独立的Neo4j服务器。
在本指南中,只有一个域对象。对于域对象彼此相关的更复杂的系统,Spring Data REST将呈现其他链接以帮助导航到连接的记录。
查找所有自定义查询:
$ curl http://localhost:8080/people/search
{
"_links" : {
"findByLastName" : {
"href" : "http://localhost:8080/people/search/findByLastName{?name}",
"templated" : true
}
}
}
您可以看到查询的URL,包括HTTP查询参数name。如果您注意到,这与@Param(“name”)界面中嵌入的注释相匹配。
要使用该findByLastName查询,请执行以下操作:
$ curl http://localhost:8080/people/search/findByLastName?name=Baggins
{
"_embedded" : {
"people" : [ {
"firstName" : "Frodo",
"lastName" : "Baggins",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/0"
},
"person" : {
"href" : "http://localhost:8080/people/0"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/search/findByLastName?name=Baggins"
}
}
}
因为您将其定义为List在代码中返回,所以它将返回所有结果。如果你定义它只返回Person,它将选择一个Person对象返回。由于这可能是不可预测的,因此您可能不希望对可返回多个条目的查询执行此操作。
您还可以发出PUT,PATCH和DELETEREST调用来替换,更新或删除现有记录。
$ curl -X PUT -H "Content-Type:application/json" -d '{ "firstName": "Bilbo", "lastName": "Baggins" }' http://localhost:8080/people/0
$ curl http://localhost:8080/people/0
{
"firstName" : "Bilbo",
"lastName" : "Baggins",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/0"
}
}
}
$ curl -X PATCH -H "Content-Type:application/json" -d '{ "firstName": "Bilbo Jr." }' http://localhost:8080/people/0
$ curl http://localhost:8080/people/0
{
"firstName" : "Bilbo Jr.",
"lastName" : "Baggins",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/0"
}
}
}
PUT替换整个记录。未提供的字段将替换为null。PATCH可用于更新项目的子集。
您可以删除记录:
$ curl -X DELETE http://localhost:8080/people/0
$ curl http://localhost:8080/people
{
"_links" : {
"self" : {
"href" : "http://localhost:8080/people{?page,size,sort}",
"templated" : true
},
"search" : {
"href" : "http://localhost:8080/people/search"
}
},
"page" : {
"size" : 20,
"totalElements" : 0,
"totalPages" : 0,
"number" : 0
}
}
此超媒体驱动界面的一个非常方便的方面是如何使用curl(或您正在使用的任何REST客户端)发现所有RESTful端点。无需与客户交换正式合同或界面文档。
摘要
恭喜!您刚刚开发了一个基于超媒体的 RESTful前端和基于Neo4j的后端的应用程序。
扩展知识
Spring 配置项
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config
Spring Boot’s property overrides
HAL format
http://stateless.co/hal_specification.html
Spring Data REST uses the HAL format for JSON output. It is flexible and offers a convenient way to supply links adjacent to the data that is served.
Evo Inflector 单词变成复数形式的库
http://www.atteo.org/2011/12/12/Evo-Inflector.html
curl
*nix 命令行工具
https://www.cnblogs.com/duhuo/p/5695256.html