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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用Neo4j来进行NLP(自然语言处理)的数据训练。Neo4j是一种图形数据库,它的图形结构非常适合处理NLP任务中的复杂关系和语义网络。 在Java中使用Neo4j,我们首先需要导入Neo4j的相关库和依赖。然后,我们可以使用Java的Neo4j驱动程序来连接和操作Neo4j数据。通过这个驱动程序,我们可以执行查询、插入、更新和删除数据等操作。 在NLP数据训练中,我们可以将文本数据转换为图形结构,并使用Neo4j来存储和处理这些数据。例如,我们可以将句子中的词和实体作为节点,将它们之间的关系(如依赖关系、语义关系)作为边。通过构建这样的图形结构,我们可以更好地表示和理解文本中的语义关系。 使用Neo4j进行NLP训练的一个常见任务是实体识别和关系抽取。我们可以使用已有的语料库和机器学习算法来训练模型,然后将模型结果存储到Neo4j中。这样,在实际应用中,我们可以使用已经训练好的模型来进行实体识别和关系抽取。 此外,通过Neo4j的图形查询语言Cypher,我们可以方便地进行复杂的查询和分析。例如,我们可以通过Cypher查询来查找具有特定关系的实体对,或者查找具有特定属性的实体。 总之,Java可以使用Neo4j来进行NLP数据训练。Neo4j的图形数据库特性使得它非常适合处理NLP中的复杂关系和语义网络。我们可以利用Neo4j的功能来存储、处理和查询NLP数据,从而提高NLP任务的效率与精度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值