Post Jobs

返回数据的情况,手动索引和模式索引

图片 5

转载请注明出处,毕竟调试了一天

一、概念和基本注解

    从JDK1.5开始,引入了源代码中的注解这一机制。注解使得 Java
源代码中不但可以包含功能性的实现代码,还可以包含元数据。

   
那么什么是元数据呢?所谓元数据,就是描述数据的数据。比如说一张图片,图片内容是它的主体数据,那么像图片的创建时间、修改时间、创建者等等这些数据,就是这张图片的元数据。

   
那么元数据有什么用呢?我们可以用元数据来创建文档、跟踪代码的依赖性和执行编译时的格式检查,并可以代替系统中原有的配置文件。

    Java 注解是 Java 代码里的特殊标记,为我们在代码中添加用 Java
程序无法表达的额外信息提供了一种格式化方法,使我们可以在编译、类加载、运行时使用这些被注解修饰的程序元素(这些程序元素包括:类、属性、方法等)。

    使用注解时要在其前面加上一个 “@” 符号,表明后面的内容为注解。

    在 Java 的 java.lang
包中,预定义了三个注解,它们分别是限定重写父类方法的@Override、标记已过时的@Deprecated和抑制编译器警告的@SuppressWarnings,通常称这三个注解为内建注解或基本注解。

    @Override 在我们编程过程中经常遇到,就不细讲了;@Deprecated
表示该类成员已经过时,在未来的版本中可能会被删除,不建议使用。@SuppressWarnings
和前两个注解有些不同,这个注解带有一个属性,表示要抑制什么样的警告信息,相关属性值的含义如下:

@SuppressWarnings(value = "deprecation") //使用了过时的程序元素
@SuppressWarnings(value = "unchecked") //执行了未检查的转换
@SuppressWarnings(value = "unused") //有程序元素未被使用
@SuppressWarnings(value = "fallthrough") //switch 程序块直接通往下一种情况,而没有break
@SuppressWarnings(value = "path") //在类路径中有不存在的路径
@SuppressWarnings(value = "serial") //在可序列化的类上缺少 serialVersionUID 定义
@SuppressWarnings(value = "finally") //任何 finally 子句不能正常完成
@SuppressWarnings(value = "all") //所有情况

和关系数据库一样,Neo4j同样可以创建索引来加快查找速度。

今天用$.post({})传递参数,账号和密码来验证登录,验证成功返回1,验证不成功返回0,结果,$.post({}),的回调函数一直无法执行,但是原来是可以的,不重大原因,我就在网上查说要写成json格式,才能传递给前端,我用的框架,还要配注解,反正是各种配置,还是解决不了,所以我决定翻阅springmvc
@ResponseBody 的底层代码,发现,前端$.post({}),
在jsp页面是一个输出流,就是会返回字符,但是,数字,貌似无法接收到,只能接收到字符串格式的返回值,于是把返回类型该了 (String
yzm=”1″) ; return yzm; 结果回调函数执行。验证成功。

二、自定义注解

   
注解之所以强大,能被众多框架所使用的主要原因在于,它可以允许程序员自定义注解,使
Java 程序变成自描述的。注解的语法形式和接口差不多,只不过在 interface
前面多了一个 @ 符号。

   
我们可以在自定义注解时定义属性,在注解类型的定义中以无参方法的形式来声明,其方法名和返回值分别定义了该属性的名字和类型。另外需要注意的是,使用带属性的注解时,需要给属性赋值,不过可以在定义注解时,给属性赋默认值。

    Java中注解成员的类型必须是如下几类: 

  1. 基本数据类型(boolean, byte, char, short, int, long, float, double);
  2. String;
  3. Class;
  4. 枚举;
  5. 其他的注解;
  6. 以上类型的数组;

    public @interface MyAnnotation {

       String name() default "张三";
       int age() default 22;
    

    }

在关系数据库中创建索引需要索引字段和指向记录的指针,通过索引可以快速查找到表中的行。

总结springmvc
5.x以前的架包,$.post({})调用返回int类型,回调函数可以执行,但是springmvc
5.x以后的,  $.post({}),
只能返回字符串,回调函数才会执行。调试了一天,终于解决了,事实证明,没有什么是底层代码解决不了的。

三、元注解

   
上面提到了元数据——描述数据的数据。还有一个元注解的概念,即描述注解的注解——使用不同注解对注解进行注解。Java
为注解单独提供了四种元注解,即@Target、@Retention、@Documented和@Inherited。下面将分别介绍这四种元注解。

在Neo4j中,其索引是通过属性来创建,便于快速查找节点或者关系。

附上代码Demo

    1、@Target

    使用 @Target
注解的目的是用于指定被修饰的注解能用于修饰哪些程序元素。如果注解定义中不存在
@Target
元注解,则此注解可以用于任意程序元素上,如果存在这样的元注解,则编译器强制实施指定的使用规则。

/**
 * ElementType.ANNOTATION_TYPE : 限制此注解用于注解类
 * ElementType.CONSTRUCTOR : 限制此注解用于构造方法
 * ElementType.FIELD : 限制此注解用于字段属性(包括枚举变量)
 * ElementType.LOCAL_VARIABLE : 限制此注解用于局部变量声明
 * ElementType.METHOD : 限制此注解用于方法声明
 * ElementType.PACKAGE : 限制此注解用于包声明
 * ElementType.PARAMETER : 限制此注解用于参数声明
 * ElementType.TYPE : 限制此注解用于类、接口(包括注解类型)或枚举声明
 */
@Target({ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE,
        ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE})
public @interface MyAnnotation {

}

手动索引

先来说一下怎样创建手动索引。

创建索引采用显示创建,就像添加节点一样添加索引项,一个索引项标识的是一个节点或者关系的属性值。

索引项中除了包含属性值,还存储了对正在索引的属性具有特定值的一个或多个节点的引用。

图片 1

以上是一个使用email属性作为键值指向节点的索引。

先通过下面代码添加数据。

try (Transaction tx = graphDb.beginTx()) {
    // 添加数据
    Label label = Label.label("Student");
    Node node1 = graphDb.createNode(label);
    node1.setProperty("name", "王翠花");
    node1.setProperty("email", "hua@qq.com");
    Node node2 = graphDb.createNode(label);
    node2.setProperty("name", "李小明");
    node2.setProperty("email", "ming@163.com");
    Node node3 = graphDb.createNode(label);
    node3.setProperty("name", "杨小红");
    node3.setProperty("email", "hong@gmail.com");
    node1.createRelationshipTo(node2, RelTypes.IS_FRIEND_OF);
    node1.createRelationshipTo(node3, RelTypes.IS_FRIEND_OF);
        // 提交事务
        tx.success();
}

 通过Neo4j查看,添加成功。

图片 2

下面来创建索引。

Neo4j中使用IndexManager来管理索引,然后通过索引标识符来访问索引。

IndexManager indexManager = graphDb.index();
Index<Node> stuIndex = indexManager.forNodes("students");

上面个两行代码通过students向索引管理器去请求获得一个索引。

假如索引不存在则会自动创建。

因为是手动创建索引,所以还需要告诉数据库要添加的属性和对应的节点。

stuIndex.add(node1, "email", "hua@qq.com");
stuIndex.add(node2, "email", "ming@163.com");
stuIndex.add(node3, "email", "hong@gmail.com");

要添加一个节点到索引中,需要提供三个参数:需要索引的节点索引键索引的值

索引创建好之后,来尝试通过索引查找节点。

try (Transaction tx = graphDb.beginTx()) {
    String stuEmail = "hua@qq.com";
    // 获得索引
    IndexManager indexManager = graphDb.index();
    Index<Node> stuIndex = indexManager.forNodes("students");
    // 获得结果集
    IndexHits<Node> indexHits = stuIndex.get("email", stuEmail);
    // getSingle()会返回唯一结果,不唯一的话返回null
    Node stu = indexHits.getSingle();
    System.out.println(stu.getProperty("name", new String()));
}
//Output
王翠花

如果一个索引对应着多个节点,例如如果将年龄作为索引键,那么会有多个学生节点有着相同的年龄。

这种情况迭代IndexHits即可。有两点需要注意:

  1. IndexHits是一次性迭代,不能重复使用。
  2. 使用完IndexHits后应该关闭。如果所有结果都已迭代,IndexHits会自动关闭,否则需要调用close()方法手动关闭。

在关系数据库中,如果更改有索引的数据,索引也会跟着自动更新。

但是对于Neo4j中采用手动方式创建的索引,Neo4j并不会随着数据的改变而自动更新。

既然没有这种机制,那么只能采用一种笨方法,就是“先删除后添加”等于“更新”。

删除索引使用Index的remove()方法。

try (Transaction tx = graphDb.beginTx()) {
    String stuEmail = "hua@qq.com";
    // 获得索引
    IndexManager indexManager = graphDb.index();
    Index<Node> stuIndex = indexManager.forNodes("students");
    // 获得要删除索引对应的节点
    Node stuNode = stuIndex.get("email", stuEmail).getSingle();
    // 删除索引
    stuIndex.remove(stuNode, "email", stuNode.getProperty("email"));
    // 输出
    for (Node n : stuIndex.query("email", "*")) {
        System.out.println(n.getProperty("name"));
    }
}
// Output
李小明
杨小红

可以看到一个索引项已经删除,这时重新对节点的属性进行设置,然后调用索引的add()方法就能完成手动的更新。

如果想删除整个索引,使用delete()方法。

indexManager.forNodes(indexName).delete();

相对于对节点建索引,关系索引很少用到,因为需要查询的对象一般都是实体,也就是节点。

虽然可以手动创建和维护索引,但是感觉很麻烦,下面介绍由数据库自动创建和维护索引的方法。

前端 

    2、@Retention

    @Retention
用于指定被修饰的注解的生命周期,生命周期分为三种,分别是 RetentionPolicy.CLASS、RetentionPolicy.RUNTIME
和 RetentionPolicy.SOURCE。如果注解定义中不存在 @Retention
元注解,则生命周期默认为 RetentionPolicy.CLASS。

/**
 * RetentionPolicy.CLASS : 编译器将把注解记录在 class 文件中,当运行 Java 程序时,虚拟机不再保留注解。
 * RetentionPolicy.RUNTIME : 编译器将把注解记录在 class 文件中,当运行 Java 程序时,虚拟机保留注解,程序可以通过反射获得该注解。
 * RetentionPolicy.SOURCE : 编译器将直接丢弃被修饰的注解
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
      String name() default "张三";
      int age() default 22;
}

图片 3图片 4

public class TestMyAnnotation {

    public static void main(String[] args) throws NoSuchMethodException, ClassNotFoundException {
        TestMyAnnotation testMyAnnotation = new TestMyAnnotation();
        testMyAnnotation.getObjectInfo();
    }

    @MyAnnotation
    @Deprecated
    public void getObjectInfo() throws ClassNotFoundException, NoSuchMethodException {
        Annotation[] annotations = Class.forName("annotation.TestMyAnnotation").getMethod("getObjectInfo").getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println("该注解是" + annotation);
            if (annotation instanceof MyAnnotation) {
                MyAnnotation myAnnotation = (MyAnnotation) annotation;
                System.out.println(myAnnotation.name());
                System.out.println(myAnnotation.age());
            }
        }
    }

}

TestMyAnnotation.java

模式索引

模式索引和关系数据库中的索引很相似。

每一个索引会对应一个标签和一组属性。例如对学生的姓名name进行索引,你只需要定义索引,数据库会负责维护它们。

无论是更新还是删除节点,索引都会自动更新或者删除。

创建模式索引的方法如下:

IndexDefinition indexDefinition;
try (Transaction tx = graphDb.beginTx()) {
    Schema schema = graphDb.schema();
    indexDefinition = schema.indexFor(Label.label("Student")).on("name").create();
    tx.success();
}

首先要获取数据库的模式,然后提供LabelProperty就完成了索引的创建,比手动创建简单了不少。

查询也同样简单,使用ResourceIterator存放结果集。

需要注意,如果ResourceIterator没有完全迭代,则需要使用close()方法手动关闭。

try (Transaction tx = graphDb.beginTx()) {
    ResourceIterator<Node> stus = graphDb.findNodes(Label.label("Student"), "name", "王翠花");
    while (stus.hasNext()) {
        System.out.println(stus.next().getProperties("name", "email"));
    }
    tx.success();
}

输出结果:

{name=王翠花, email=hua@qq.com}

删除索引的方法:

try (Transaction tx = graphDb.beginTx()) {
    Label label = Label.label("Student");
    for (IndexDefinition indexDefinition : graphDb.schema().getIndexes(label)) {
        // There is only one index
        indexDefinition.drop();
    }
    tx.success();
}

账号:uno,  

    3、@Documented

    在默认的情况下,使用 javadoc
工具自动生成文档时,注解将被忽略掉。如果想在文档中也包含注解,必须使用 @Documented
注解。

@Documented
public @interface MyAnnotation {
}

自动索引

《Neo4j
实战》这本书中的数据库版本是2.x,书中提到了自动索引,一种通过配置文件来创建索引的方法。

但是在目前的3.x版本中已经废弃,建议使用模式索引代替。

图片 5

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图