JAX-RS是一个用于构建REST资源的Java API,可以使用JAX-RS注解装饰每一个扩展类,从而让服务器处理对应的http请求,附加注解可以用来控制请求和响应的格式,http头和URI模板的格式。
 
 
下面看一个服务器扩展实现的示例,允许客户端请求社交网络的两个成员之间的距离

@Path(”/distance”)/*注解规定请求URL以/distance开始*/
Public class SocialNetworkExtension{
private final ExecutionEngine executionEngine ;
/*@ Context GraphDatabaseSerivce db引用到一个数据*/
Public SocialNetworkExtension(@ Context GraphDatabaseSerivce db){
This. executionEngine =new ExecutionEngine (db);
}
@GET/*get请求*/
@produces(“text/plain”)
@Path(“/{name1}/{name2}”) /*匹配/distance/name1/name2,占位符*/
Public String getDistance(@PathParam(“name1”) String name1,@PathParam(“name2”) String name2){
String query=“start…”;
Map<String,Object> params=new HashMap<String,Object>();
params.put(“name1”,name1);
Params.put(“name2”,name2);
ExcutionResult result= executionEngine .execute(query,params);
Return String.valueof(result.columnAs(“depth”).next());
}}

数据结构:Neo4j将图数据存储在若干不同的存储文件中,每个存储文件包含特定部分的数据(如节点,联系,属性等),每个节点记录长度为9个字节,通过大小固定的记录可以快速查找到存储文件中的节点。一个节点的第一个字节是“是否在使用”的标志位。接下来的4个字节表示关联到该节点的第一个联系,最后4个字节表示该节点的第一个属性的ID。节点是几个指向联系和属性列表的指针。
像节点一样,联系存储区的记录的大小也是固定的,每个记录的长度为33个字节。每个联系记录包含联系的起始节点ID和结束节点ID,联系类型的指针,以及起始节点和结束节点的上一个联系和下一个联系。
要读取节点的属性,只需要从指向第一个属性的指针开始遍历单向链表结构。要查询一个节点的联系,可以从指向第一个联系的节点联系指针开始,顺着特定节点的联系的双向链表寻找。
可以使用联系关联的起始节点ID和结束节点ID检查他们的节点记录,用这些ID乘以节点记录的大小,就可以立即计算出每个节点在存储文件中的偏移量
属性记录也是大小固定的,每个属性记录包括4个属性块和属性链中下一个属性的ID(属性的链表是单向的)
 

服务器集群模式: Neo4j HA模式总有单个master,零个或多个slave。与其他ms复制架构,Neo4j HA的slave可以处理写操作,而无需重定向写入到master。

Neo4j HA使用Apache ZooKeeper来进行master选举和服务器间状态信息传播。ZooKeeper可以看做是分布式服务协调器。Neo4j HA集群需要依赖ZooKeeper进程初始主选择,新master选举和集群内服务器状态报告。当master故障,新的master将自动选举。当 master故障,任何写事务都将回滚,并且在master选举期间,任何写操作都不会发生。 ZooKeeper需要大量ZooKeeper实例从而保证正常运行。这就意味着zookeeper实例应该永远是个奇数。
 

查询语法(Cyphe Query Language)
neo4j自己基于图论的搜索算法,实现了一套查询语言解析,提供了一些常见的聚合函数(max,sum,min,count等)。

 Ø  START:在图中的开始点,通过元素的ID或所以查找获得。

 Ø  MATCH:图形的匹配模式,束缚于开始点。

 Ø  WHERE:过滤条件。

 Ø  RETURN:返回所需要的。
   Ø  CREATE:创建节点或者关系
   Ø DELETE:删除节点、关系或者属性
   Ø SET:设置属性的值 FOREACH:对list中的元素一次一  个的执行操作( Performs updating actions once per element in a list)
   Ø WITH:切分一个query成多个不同的部分
 
通过索引找到一个名叫'John'的用户,并遍历图找到他的朋友的朋友,返回John和这些朋友的信息
 

START john=node:node_auto_index(name = 'John')
MATCH john-[:friend]->()-[:friend]->fof
RETURN john, fof
 
 
模糊查询节点id属性中包含11的,的节点。

START ne=node:ne('id=*11*') 
  return ne
条件,模糊查询。查询 label 含中山的网元

start n=node(3) match n-[:NE]-ne where ne.label =~ '.*中山.*'
  return ne.id, ne.label, ne.name;
根据索引为nePort,针对id模糊查询全部节点。根据id排序,limit只取前10条记录

start n = node:nePort('id:*')

match (x)-[:NE_PORT]->(n)

return n,x

order by n.id limit 10
 
Spring Data Neo4j:为Spring开发人员提供了熟悉的方式与Neo4j进行交互,使用基于注解的方式与Spring的框架进行集成。在POJO(简单java对象,Plain Old Java Object)实体及其域上添加一些注解,这样Spring Data Neo4j就能将Java对象映射为图元素,这些实体的注解通过节点(@NodeEntity)和关系(@RelationshipEntity)来实现,域上注解声明了与其它实体的关系(@RelatedTO),自定义转换,自动标引(@Indexed)或者计算出的/衍生的值(@Query),Spring Data Neo4j允许我们存储实体的类型信息(继承体系),从而可以执行一些高级的操作和类型的转换。

@NodeEntity
public class World {
private final static String REACHABLE_BY_ROCKET = "REACHABLE_BY_ROCKET";
 
    @GraphId
    private Long id;
 
    // Uses default schema based index
    @Indexed
    private String name;
 
    // Uses legacy index mechanism
    @Indexed(indexType = IndexType.SIMPLE)
    private int moons;
 
    @Fetch
    @RelatedTo(type = REACHABLE_BY_ROCKET, direction = Direction.BOTH)
    private Set<World> reachableByRocket;

Spring Data Neo4j的核心是Neo4jTemplate,它提供了(类似与JdbcTemplate)各种低层级的功能,这些功能对Neo4j API进行了封装以支持所匹配的领域对象。Spring Data Neo4j通过两个XML命名空间元素来进行配置,用来进行通用开发的搭建和Repository的配置。
Spring Data Neo4j支持嵌入式模式和服务器模式,服务器模式要通过Neo4j的Java Rest API绑定来进行访问

Org.springframe work.data:spring-data-neo4j
<dependencies>
        <!-- SDN for simple mapping mode -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-neo4j</artifactId>
            <version>${spring-data-neo4j.version}</version>
        </dependency>
<dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-kernel</artifactId>
            <version>${neo4j.version}</version>
            <type>test-jar</type>
            <scope>test</scope>
        </dependency>
</dependencies>

嵌入式模式
•<?xml version="1.0" encoding="UTF-8" standalone="no"?>
•<beans xmlns="http://www.springframework.org/schema/beans"
•       xmlns:context="http://www.springframework.org/schema/context"
•       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
•       xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
•       xmlns:tx="http://www.springframework.org/schema/tx"
•……">
•<context:spring-configured/>
•    <context:annotation-config/>
•    <context:component-scan base-package="org.springframework.data.neo4j.examples.hellograph" />
•<!—建立一个图数据库>
•    <neo4j:config storeDirectory="target/neo4j-db-plain"
• base-package="org.springframework.data.neo4j.examples.hellograph.domain"/>
 <neo4j:repositories base-package="org.springframework.data.neo4j.examples.hellograph.repositories"/>
•<tx:annotation-driven />
•</beans>

服务器模式
•<?xml version="1.0" encoding="UTF-8" standalone="no"?>
•<beans xmlns="http://www.springframework.org/schema/beans"
•       xmlns:context="http://www.springframework.org/schema/context"
•       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
•       xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
•       xmlns:tx="http://www.springframework.org/schema/tx"
•……">
•<neo4j:config graphDatabaseService=“graphDatabaseService”/>
•<bean id=“graphDatabaseService”
•class=“org.springframework.data.neo4j.rest.SpringRestGraphDatabase”>
•<constructor index=“0” value=“http://10.168.104.159:7474/db/data”>
•</bean>
•</beans>

Repository 数据访问层,为了让代码变得更加简单,Spring Data在Template的基础上提供了一个存储( repository )抽象,这样可以减少数据访问对象在实现一个普通接口时去定义通用场景的代价。
public class Customer{
private long id;
private String firstname;
private String lastname;
private Address address;
}
通过传统的方式至少需要实现一个存储类,包含基本的CRUD(create,read,Update和delete
)方法,以及通过限制条件来访问实体子集的查询方法。

使用Spring Data Repository 的方式能够避免大多数的代码,只需要为这个实体存储声明简单的接口定义即可。
Public interface customerRepository extends Repository<Customer,long>{
……
}
激活Spring Data Repository
<beans:beans xmlns:……>
<jpa:repositories base-package=“com.XXX. repositoy” >
</beans>

package org.springframework.data.neo4j.examples.hellograph.repositories;
 
import org.springframework.data.neo4j.examples.hellograph.domain.World;
import org.springframework.data.neo4j.repository.GraphRepository;
 
public interface WorldRepository extends GraphRepository<World> {}

1.声明持久层的接口,该接口继承 Repository,Repository 是一个标记型接口,它不包含任何方法,当然如果有需要,Spring Data 也提供了若干 Repository 子接口,其中定义了一些常用的增删改查,以及分页相关的方法。
2.在接口中声明需要的业务方法。Spring Data 将根据给定的策略来为其生成实现代码。
3.在 Spring 配置文件中增加一行声明,让 Spring 为声明的接口创建代理对象。配置了 <jpa:repositories> 后,Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象。
此外,<jpa:repository> 还提供了一些属性和子标签,便于做更细粒度的控制。可以在 <jpa:repository> 内部使用 <context:include-filter>、<context:exclude-filter> 来过滤掉一些不希望被扫描到的接口。
 

Spring Data JPA——参考文档
http://jpa.coding.io/
 

 

Neo4J图库的基础介绍(二)-图库开发应用的更多相关文章

  1. Neo4J图库的基础介绍(一)

    •Neo4j是一个高性能的,NOSQL图形数据库,它完全支持ACID(原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability))数据 ...

  2. python基础介绍二

    一.python种类 1.1 Cpython python官方版本,使用c语言实现,运行机制:先编译,py(源码文件)->pyc(字节码文件),最终执行时先将字节码转换成机器码,然后交给cpu执 ...

  3. Slickflow.NET 开源工作流引擎基础介绍(二) -- 引擎组件和业务模块的交互

    集成流程引擎的必要性 业务过程的变化是在BPM系统中常见的现象,企业管理层需要不断优化组织架构,改造业务流程,不可避免地带来了业务流程的变化,企业信息系统就会随之面临重构的可能性.一种直接的方式是改造 ...

  4. Slickflow.NET 开源工作流引擎基础介绍(二) -- 引擎组件和业务系统的集成

    集成流程引擎的必要性 业务过程的变化是在BPM系统中常见的现象,企业管理层需要不断优化组织架构,改造业务流程,不可避免地带来了业务流程的变化,企业信息系统就会随之面临重构的可能性.一种直接的方式是改造 ...

  5. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  6. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  7. { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型

    MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...

  8. XML基础介绍【二】

    XML基础介绍[二] 1.schema约束dtd语法: <!ELEMENT 元素名称 约束>schema符合xml的语法,xml语句.一个xml中可以有多个schema,多个schema使 ...

  9. php基础篇-二维数组排序 array_multisort

    原文:php基础篇-二维数组排序 array_multisort 对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下: array_multisort(a ...

随机推荐

  1. shiro整合oauth

    一.基本思路脑图 二.客户端shiro配置 shiro配置文件 <?xml version="1.0" encoding="UTF-8"?> < ...

  2. webpack 多页应用架构系列实战

    阅读目录 1.webpack配置了解 2.webpack CommonsChunkPlugin公共代码剥离 3.了解ProvidePlugin的用途 回到顶部 1.webpack配置了解 webpac ...

  3. 【Data Visual】一文搞懂matplotlib数据可视化

    一文搞懂matplotlib数据可视化 作者:白宁超 2017年7月19日09:09:07 摘要:数据可视化主要旨在借助于图形化手段,清晰有效地传达与沟通信息.但是,这并不就意味着数据可视化就一定因为 ...

  4. MySQL IO线程及相关参数调优

    一.关于一个SQL的简单的工作过程 1.工作前提描述 1.启动MySQL,在内存中分配一个大空间innodb_buffer_pool(其中log_buffer) 2.多用户线程连接MySQL,从内存分 ...

  5. 小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门

    前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代 ...

  6. Spring源码情操陶冶-ContextLoader

    前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-ContextLoaderListener 静态代码块内容 ContextLoader在被主动调用的时候,会执行其的一个静态块,代码 ...

  7. C指针1

    //定义:指针是一个特殊的数据类型,指针指向内存中的地址,因此,指针变量存储的是内存中的一个地址 //例子,%p表示打印一个地址,打印p表示打印p指向的地址 //输出结果为0x7fff5fbff7dc ...

  8. C#的基础数据类型

    一.概述 C# 的类型系统是统一的,因此任何类型的值都可以按对象处理.C# 中的每个类型直接或间接地从 object 类类型派生,而 object 是所有类型的最终基类.C#的数据类型主要分为三类:值 ...

  9. linux(centos)下安装PHP的PDO扩展

    PHP 数据对象PDO扩展为PHP访问数据库定义了一个轻量级的一致接口.PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据.最近在我们的建站和O ...

  10. ubuntu上安装nginx+mysql+php5-fpm(PHP5 - FastCGI Process Manager)

    题外话:由于近段时间测试环境ssh链路质量不大好,经常短线.故我把整个安装过程放到screen里去执行,以防止断线中断了安装过程.执行screen -S install,这样断线后,只要再执行scre ...