Neo4j 爬坑笔记for3.2.6

官网语法,非常详尽:http://neo4j.com/docs/developer-manual/current/cypher/clauses/match/

A:请对应版本号,不同大版本可能会有很大区别

B:我会对我学习过程中遇到的难点详细说明,有些基本的东西会带过

C:  初学,有错误我以后会修改

=============================2017.11.02============================================

1、是什么:

简单来说就是用于图形计算的非关系行数据库。

2、安装:略

      linux与windows版本,学习的话装windows即可,安装非常简单,这里不说了,百度会有好多。

      进入如图:

       

3、使用:

      版本:v3.2.6                 2017.11.2日最新版本 

a、基础语法CQL(网上语法很多,但都没有解释什么是什么):

      节点

      create (a:aDemo{dId:"001",name:"zhangsan"})

      create:创建(创建出来的点叫节点);

      a:我开始理解的是类似表别名、变量名(很可能不对,好像没有什么意义,先一放);

      aDemo:经试验类似于表名,或者说一个类型的集合

        create (a:aDemo{dId:"001",name:"zhangsan"})

        create (a:aDemo{dId:"002",name:"lisi"})

        create (a:aDemo{dId:"003",name:"wamhwu"})

        create (a:aDemo{dId:"003",name:"wamhwu"})

        create (a:aDemo{dId:"003",name:"wamhwu"})

      依次执行,我创建了五个节点,每个节点内置了一个自增的唯一id

      MATCH(n:aDemo {name:"lisi"}) DETACH DELETE n

      MATCH (n) RETURN n  也可:start a = node(*) return a//查询所有集合中所有数据

      MATCH (n:aDemo) RETURN n LIMIT 25//查询 aDemo集合中所有数据

      MATCH (n:aDemo{name:"zhangsan"}) RETURN n LIMIT 25

   MATCH (dc:aDemo{name:"zhangsan"})SET dc.newAttr = "new attr" RETURN dc

  关系:

   摘抄地址:W3C:https://www.w3cschool.cn/neo4j/neo4j_cql_relationship_basics.html

   语法:

	CREATE (<node1-details>)-[<relationship-details>]->(<node2-details>)
  • <node1-details>是“From Node”节点详细信息

    <node2-details>是“到节点”节点详细信息

    relationship-details>是关系详细信息

    CREATE (n1:aDemo{name:"zhangsan"})-[r1:Relationship]->(n2:aDemo{name:"wangwu"})

    此处值得注意的是,我有多个张三一个李四,只建立了一条关系(最后一条张三(id最大))

    =========================================================================

    基础语法不准备再补充了,有这点基础,就可以边百度边用了,下面是尝试集成到Spring4中,网上只有

    集成到Spring-boot的资源与教程,但是为了加一个图数据库改动框架实在有些得不偿失。

    首先看一下简单的JDBC:

    demo写完就找不到了,那就不管了,下面是需求,结合SpringMVC使用Neo4j


    ===================================================================================20171110

    今天正式填完了所有坑,下面记录下过程:

    官方文档祭天:

    https://docs.spring.io/spring-data/data-neo4j/docs/4.2.0.RELEASE/reference/html/#preface.requirements

    首先对应版本:


    3. Requirements
    Spring Data Neo4j 4.2.x at minimum, requires:
    JDK Version 8 and above.
    Neo4j Graph Database 2.3.x / 3.0.x / 3.1.x and above.
    Spring Framework 4.3.6.RELEASE and above.
    If you plan on altering the version of the OGM make sure it is only in the 2.1.1+

    release family.

    项目结构:


    升级jdk(主要是把编译器换成1.8的):


    根据要求配置依赖包:

     

    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<spring.version>4.3.12.RELEASE</spring.version><!-- 声明版本号,以后统一在这里进行管理 -->
    	</properties>
    	<dependencies>
    		<!-- neo4j-data以及依赖包 -->
    		<dependency>
    			<groupId>org.springframework.data</groupId>
    			<artifactId>spring-data-neo4j</artifactId>
    			<version>4.2.8.RELEASE</version><!-- 4.1.1.RELEASE -->
    		</dependency>
    		<dependency>
    			<groupId>org.neo4j</groupId>
    			<artifactId>neo4j-ogm-core</artifactId>
    			<version>2.1.1</version>
    			<scope>compile</scope>
    		</dependency>
    		<!-- Only add if you're using the Bolt driver这里我选择了bolt协议 -->
    		<dependency>
    			<groupId>org.neo4j</groupId>
    			<artifactId>neo4j-ogm-bolt-driver</artifactId>
    			<version>2.1.1</version>
    			<scope>runtime</scope>
    		</dependency>
    		<!-- Only add if you're using the HTTP driver -->
    		<!-- <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-ogm-http-driver</artifactId> 
    			<version>2.1.1</version> <scope>runtime</scope> </dependency> -->
    
    		<!-- Only add if you're using the Embedded driver -->
    		<!-- <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-ogm-embedded-driver</artifactId> 
    			<version>2.1.1 RELEASE</version> <scope>runtime</scope> </dependency> -->
    因为升级了spring版本,对其它组件版本进行了微调,这个不难,也就不列举了
    

    配置启动类(有xml与方法配置的方式,这里使用了后者):

    MyConfiguration类:
    package com.neo.conf;
    
    import org.neo4j.ogm.session.SessionFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    
    @Configuration
    @EnableNeo4jRepositories(basePackages = "com.neo.repository")//相当于service、执行库的位置
    @EnableTransactionManagement
    public class MyConfiguration {
    
       @Bean
       public org.neo4j.ogm.config.Configuration getConfiguration() {
          org.neo4j.ogm.config.Configuration config =
                   new org.neo4j.ogm.config.Configuration();
          // TODO: Temporary uses the embedded driver. We need to switch to http
          // driver. Then we can horizontally scale neo4j
          config.driverConfiguration()
          .setDriverClassName("org.neo4j.ogm.drivers.bolt.driver.BoltDriver")
          .setURI("bolt://neo4j:123456@localhost")
          .setConnectionPoolSize(150);
          return config;
       }
    
       @Bean
       public SessionFactory getSessionFactory() {
          // Return the session factory which also includes the persistent entities
          return new SessionFactory(getConfiguration(), "com.neo.entitys");
       }
    }
    
    Repository类:
    
    /**
     * @author Michael Hunger
     * @author Mark Angrish
     */
    
    public interface MovieRepository  extends GraphRepository<Movie>{
    
    	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}")
    	Collection<Movie> graph(@Param("limit") int limit);
    }
    
    
    @Repository 
    public interface PersonRepository extends GraphRepository<PersonBak> {
    }
    
    public interface RoleRepository extends GraphRepository<Role> {}
    
    
    
    
    
    
    
    
    
    
    Entity类:
    
    
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
    @NodeEntity
    public class Movie {
    
    	@GraphId
    	private Long id;
    
    	private String title;
    
    	private int released;
    
    	private String tagline;
    
    	@Relationship(type = "ACTED_IN", direction = Relationship.INCOMING)
    	private List<Role> roles = new ArrayList<>();
    
    	public Movie() {
    	}
    	
    	public Movie(Long id,String title, int released) {
    		this.id=id;
    		this.title = title;
    		this.released = released;
    	}
    	public Movie(String title, int released) {
    		this.title = title;
    		this.released = released;
    	}
    	public Long getId() {
    		return id;
    	}
    	public void setId(Long id) {
    		this.id = id;
    	}
    	public String getTitle() {
    		return title;
    	}
    	public int getReleased() {
    		return released;
    	}
    
    	public String getTagline() {
    		return tagline;
    	}
    	public Collection<Role> getRoles() {
    		return roles;
    	}
    	public void addRole(Role role) {
    		this.roles.add(role);
    	}
    }
    
    
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
    @NodeEntity
    public class Person {
    
    	@GraphId
    	private Long id;
    
    	private String name;
    
    	private int born;
    
    	@Relationship(type = "ACTED_IN")
    	private List<Movie> movies = new ArrayList<>();
    
    	public Person() {
    	}
    	public Person(String name) {
    		this.name = name;
    	}
    	public Person( Long id,String name) {
    		this.id = id;
    		this.name = name;
    	}
    	public Long getId() {
    		return id;
    	}
    	public String getName() {
    		return name;
    	}
    	public int getBorn() {
    		return born;
    	}
    	public List<Movie> getMovies() {
    		return movies;
    	}
    }
    
    
    
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
    @RelationshipEntity(type = "ACTED_IN")
    public class Role {
    
    	@GraphId
    	private Long id;
    
    	private Collection<String> roles = new ArrayList<>();
    
    	@StartNode
    	private Person person;
    
    	@EndNode
    	private Movie movie;
    
    	public Role() {
    	}
    	public Role(Movie movie, Person actor) {
    		this.movie = movie;
    		this.person = actor;
    	}
    	public Long getId() {
    		return id;
    	}
    	public Collection<String> getRoles() {
    		return roles;
    	}
    	public Person getPerson() {
    		return person;
    	}
    	public Movie getMovie() {
    		return movie;
    	}
    	public void addRoleName(String name) {
    		this.roles.add(name);
    	}
    }
    
    
    
    
    
    
    
    
    
    
    
    使用:
    @Autowired
    	private PersonRepository personRepository;
    	@Autowired 
    	MovieRepository movieRepository;
    	@Autowired 
    	RoleRepository roleRepository;
    
    
        Public void test(){
    		Person persontmp1=new Person("anmuxi12222");
    		Movie movieTmp=new Movie(66l,"title22222222",1);
    		
    		
    		Role ro = new Role(movieTmp,persontmp1);
    		
    		roleRepository.save(ro);      
    Collection<Movie> graph = movieRepository.graph(10);
    		Iterator<Movie> iterator = graph.iterator();
    		while (iterator.hasNext()) {
    			Movie next = iterator.next();
    			System.out.println(next.getId());
    			
    		}
    }

    这时候发现,存在中文乱码情况:

    查看源码,打印了下系统编码

    String csn = Charset.defaultCharset().name();
    System.err.println(csn);//结果是GBK

    配置环境变量:

    “JAVA_TOOL_OPTIONS” 变量,值为“-Dfile.encoding=UTF-8” over


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值