【Spring Boot学习】Neo4j 学习

【SDN Architecture】

A high level look of the architecture looks like:

Spring Data Neo4j Architecture

  • Drivers are used to connect to the database. At the moment these come in 3 variants: Embedded, HTTP and the binary protocol Bolt.

  • The Object Graph Mapper (OGM): This is similar to an ORM in that it maps database nodes to java objects. This library is agnostic of any framework (including Spring).

  • Spring Data Neo4j 4: Provides syntactic sugar and code on top of the OGM to help quickly build Spring Based Neo4j/OGM apps.

Supported keywords for query methods
KeywordSampleCypher snippet

After

findByLaunchDateAfter(Date date)

n.launchDate > date

Before

findByLaunchDateBefore(Date date)

n.launchDate < date

Containing(String)

findByNameContaining(String namePart)

n.name CONTAINS namePart

Containing(Collection)

findByEmailAddressesContains(Collection<String> addresses)

findByEmailAddressesContains(String address)

ANY(collectionFields IN [addresses] WHERE collectionFields in n.emailAddresses)

ANY(collectionFields IN address WHERE collectionFields in n.emailAddresses)

In

findByNameIn(Iterable<String> names)

n.name IN names

Between

findByScoreBetween(double min, double max)

n.score >= min AND n.score <= max

StartingWith

findByNameStartingWith(String nameStart)

n.name STARTS WITH nameStart

EndingWith

findByNameEndingWith(String nameEnd)

n.name ENDS WITH nameEnd

Exists

findByNameExists()

EXISTS(n.name)

True

findByActivatedIsTrue()

n.activated = true

False

findByActivatedIsFalse()

NOT(n.activated = true)

Is

findByNameIs(String name)

n.name = name

NotNull

findByNameNotNull()

NOT(n.name IS NULL)

Null

findByNameNull()

n.name IS NULL

GreaterThan

findByScoreGreaterThan(double score)

n.score > score

GreaterThanEqual

findByScoreGreaterThanEqual(double score)

n.score >= score

LessThan

findByScoreLessThan(double score)

n.score < score

LessThanEqual

findByScoreLessThanEqual(double score)

n.score <= score

Like

findByNameLike(String name)

n.name =~ name

NotLike

findByNameNotLike(String name)

NOT(n.name =~ name)

Near

findByLocationNear(Distance distance, Point point)

distance( point(n),point({latitude:lat, longitude:lon}) ) < distance

Regex

findByNameRegex(String regex)

n.name =~ regex

And

findByNameAndDescription(String name, String description)

n.name = name AND n.description = description

Or

findByNameOrDescription(String name, String description)

n.name = name OR n.description = description(Cannot be used to OR nested properties)

【Annotated queries】

 

public interface MovieRepository extends Neo4jRepository<Movie, Long> {

    // returns the node with id equal to idOfMovie parameter
    @Query("MATCH (n) WHERE id(n)={0} RETURN n")
    Movie getMovieFromId(Integer idOfMovie);

    // returns the nodes which have a title according to the movieTitle parameter
    @Query("MATCH (movie:Movie {title={0}}) RETURN movie")
    Movie getMovieFromTitle(String movieTitle);

    // same with optional result
    @Query("MATCH (movie:Movie {title={0}}) RETURN movie")
    Optional<Movie> getMovieFromTitle(String movieTitle);

    // returns a Page of Actors that have a ACTS_IN relationship to the movie node with the title equal to movieTitle parameter.
    @Query(value = "MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN actor", countQuery= "MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN count(actor)")
    Page<Actor> getActorsThatActInMovieFromTitle(String movieTitle, PageRequest page);

    // returns a Page of Actors that have a ACTS_IN relationship to the movie node with the title equal to movieTitle parameter with an accurate total count
    @Query(value = "MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN actor", countQuery = "MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN count(*)")
    Page<Actor> getActorsThatActInMovieFromTitle(String movieTitle, Pageable page);

    // returns a Slice of Actors that have a ACTS_IN relationship to the movie node with the title equal to movieTitle parameter.
    @Query("MATCH (movie:Movie {title={0}})<-[:ACTS_IN]-(actor) RETURN actor")
    Slice<Actor> getActorsThatActInMovieFromTitle(String movieTitle, Pageable page);

    // returns users who rated a movie (movie parameter) higher than rating (rating parameter)
    @Query("MATCH (movie:Movie)<-[r:RATED]-(user) " +
           "WHERE id(movie)={movieId} AND r.stars > {rating} " +
           "RETURN user")
    Iterable<User> getUsersWhoRatedMovieFromTitle(@Param("movieId") Movie movie, @Param("rating") Integer rating);

    // returns users who rated a movie based on movie title (movieTitle parameter) higher than rating (rating parameter)
    @Query("MATCH (movie:Movie {title:{0}})<-[r:RATED]-(user) " +
           "WHERE r.stars > {1} " +
           "RETURN user")
    Iterable<User> getUsersWhoRatedMovieFromTitle(String movieTitle, Integer rating);

    @Query(value = "MATCH (movie:Movie) RETURN movie;")
    Stream<Movie> getAllMovies();
}
public interface PersonRepository extends Neo4jRepository<Person, Long> {

    // MATCH (person:Person {name={0}}) RETURN person
    Person findByName(String name);

    // MATCH (person:Person)
    // WHERE person.age = {0} AND person.married = {1}
    // RETURN person
    Iterable<Person> findByAgeAndMarried(int age, boolean married);

    // MATCH (person:Person)
    // WHERE person.age = {0}
    // RETURN person ORDER BY person.name SKIP {skip} LIMIT {limit}
    Page<Person> findByAge(int age, Pageable pageable);

    // MATCH (person:Person)
    // WHERE person.age = {0}
    // RETURN person ORDER BY person.name
    List<Person> findByAge(int age, Sort sort);

    //Allow a custom depth as a parameter
    Person findByName(String name, @Depth int depth);

    //Fix the depth for the query
    @Depth(value = 0)
    Person findBySurname(String surname);

}
public interface MovieRepository extends Neo4jRepository<Movie, Long> {

    @Query("MATCH (movie:Movie)-[r:RATING]\->(), (movie)<-[:ACTS_IN]-(actor:Actor) " +
           "WHERE movie.id={0} " +
           "RETURN movie as movie, COLLECT(actor) AS 'cast', AVG(r.stars) AS 'averageRating'")
    MovieData getMovieData(String movieId);

    @QueryResult
    public class MovieData {
        Movie movie;
        Double averageRating;
        Set<Actor> cast;
    }

}

引入依赖

    ...
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-neo4j</artifactId>
        </dependency>
    </dependencies>
    ...
org.springframework.data.rest.level=DEBUG
debug: true
spring.data.neo4j.uri=bolt://localhost
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=199611@liu

【bean】

define projections to serve up simplified and reduced views of resources.


/**
 * @author ldd
 * @version  v1.0
 * @function movie 节点
 */
@NodeEntity
public class Movie {

	@Id
	@GeneratedValue
	private Long id;
	private String title;
	private int released;
	private String tagline;

	@JsonIgnoreProperties("movie")
	@Relationship(type = "ACTED_IN", direction = Relationship.INCOMING)
	private List<Role> roles;
}
@RelationshipEntity(type = "ACTED_IN")
public class Role {

    @Id
    @GeneratedValue
	private Long id;
	private List<String> roles = new ArrayList<>();

	@StartNode
	private Person person;

	@EndNode
	private Movie movie;
}
@RepositoryRestResource(collectionResourceRel = "movies", path = "movies")
public interface MovieRepository extends Neo4jRepository<Movie, Long> {

	Movie findByTitle(@Param("title") String title);

	Collection<Movie> findByTitleLike(@Param("title") String title);

    @Query("MATCH (m:Movie)<-[r:ACTED_IN]-(a:Person) RETURN m,r,a LIMIT {limit}")
   // @Query("MATCH (m:Movie)<-[r:ACTED_IN]-(a:Person) RETURN m LIMIT {limit}")
	Collection<Movie> graph(@Param("limit") int limit);
}

Then add to your Spring Boot configuration class these annotations:

@SpringBootApplication
@EnableNeo4jRepositories("com.example.demo.repositories") 
/*NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.demo.repositories Repository'*/
public class Neo4jPracticeApplication {

    public static void main(String[] args) {
        SpringApplication.run(Neo4jPracticeApplication.class, args);
    }
}

https://docs.spring.io/spring-data/neo4j/docs/5.0.x/reference/html/#reference 

### 回答1: Spring Boot Neo4j 是一个基于 Spring Boot 框架的 Neo4j 图数据库应用程序开发框架。它提供了一系列的 API 和工具,帮助开发者快速构建和管理知识图谱应用程序。通过 Spring Boot Neo4j,开发者可以轻松地创建和管理节点、关系和属性,实现知识图谱的可视化展示和数据分析。同时,Spring Boot Neo4j 还支持多种数据存储和查询方式,包括 Cypher 查询语言和 Java API 等。它是构建知识图谱应用程序的一个强大工具。 ### 回答2: Spring Boot Neo4j知识图谱是一种基于Spring Boot框架和Neo4j图形数据库的知识图谱应用程序开发方案。知识图谱是一种基于图形结构的数据存储和查询方法,能够以更自然的方式对数据进行建模和操作。它不仅能够支持复杂的数据查询和处理任务,还能够帮助企业构建更智能的系统和服务。 Spring Boot Neo4j知识图谱的主要特点包括: 1. 灵活的数据建模:Neo4j是一个基于节点(Node)和关系(Relationship)的图形数据库,通过这种方式可以更加自然地建模和组织数据。使用Spring Boot Neo4j,可以利用Neo4j的节点和关系来建立知识图谱,并且灵活地处理各种实体和关系之间的复杂关系。 2. 快速的数据查询:Neo4j能够在复杂的关系网络中快速地定位和查询数据,这种查询方式非常适用于需要快速搜索特定数据的应用。使用Spring Boot Neo4j,用户可以轻松地编写Cypher查询语句,从而快速地查询知识图谱中的数据。 3. 高效的数据处理:知识图谱处理任务通常需要处理大量的数据,这对于传统的数据库系统来说可能是一种挑战。然而,Neo4j采用了一种内存映射技术,可以非常高效地处理大量的数据。同时,Spring Boot提供了丰富的扩展机制,使得用户可以自由地扩展系统的功能和性能。 4. 简便的集成和部署:Spring Boot是一种非常便捷的应用程序开发框架,它可以充分利用Java的生态系统,并且提供了很多常用的组件和工具。Spring Boot Neo4j利用了Spring Boot的这些优点,可以快速地构建、测试和部署知识图谱应用程序。 总之,Spring Boot Neo4j知识图谱是一种非常实用的应用程序开发方案,它可以帮助企业构建更智能、更强大的系统和服务,应用于知识管理、推荐系统、社交网络、金融和医疗等领域。 ### 回答3: Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它允许开发人员可以更快速、更容易地构建、部署和运行应用程序。而Neo4j是一种开源的图形数据库,可以存储和管理网络、社交媒体、金融和推荐数据。它适用于需要处理大量连接数据的应用程序场景。 知识图谱是一种图形数据库,并提供了一个完整的知识管理和数据挖掘平台,它通过图形、搜索、推理以及其他技术,对多源异构的数据进行建模与智能分析。将Spring BootNeo4j结合使用,可以实现知识图谱的构建和应用。 在Spring Boot中使用Neo4j,需要引入Spring Data Neo4j插件。Spring Data Neo4j提供了一些注解和API操作来简化图形数据库的使用,并与Spring Boot集成得非常紧密。可以通过注解来定义图形数据库中的节点和关系,在查询时可以使用一些简单的方法,如通过名称或其他属性过滤节点,或者通过指定节点之间的关系进行遍历。 通过使用Spring BootNeo4j,开发人员可以更轻松地管理和查询图形数据库,适应更复杂的数据模型和图形查询,并利用Neo4j的图形算法来实现更深入的数据分析。此外,这种方法还可以最小化与数据库平台的交互,提高应用程序的性能和可扩展性。最终将构建出强大的知识图谱应用程序,帮助我们更好地了解和管理数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路途…

点滴记录

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值