037 使用REST訪問Neo4j數據

原文

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

PagingAndSortingRepository

https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/PagingAndSortingRepository.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章