Grails Neo4j插件0.2版发布

Stella981
• 阅读 557

Stefan Armbruster在自己的Blog上公布了Grails Neo4j插件0.2版发布的消息

前些时候InfoQ中文站已经报导了Neo4j 1.0的发布。Neo4j是一款基于Java的NoSQL图形数据库:

相对于关系数据库来说,图形数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询——在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。

Neo4j有3个基本构建块:

  • Node(又叫做vertex)——从概念上来说,这类似于对象实例,拥有唯一的ID。
  • Relationship(又叫做edge)——它连接了两个Node,此外还有方向和RelationshipType。
  • Property(又叫做attribute)——他们是字符串类型的key/Object值对,Node与Relationship都有Property。

虽然Neo4j 1.0版最近发布不久,但它的Grails插件早在去年10月就已经出现了,按照Stefan Armbruster的说法:

这个插件可以在Grails应用中透明的使用。你只需要做一件事情:移除Hibernate插件,安装neo4j插件。

grails uninstall-plugin hibernate
grails install-plugin neo4j

需要提醒的是,Neo API的每个调用都需要在一个事务中,对于一般使用(控制器中),该插件采用类似Hibernate的OSIV方式工作。但对于其他情形,就得自己控制事务了,Stefan给出了他的Bootstrap.groovy代码:

import org.springframework.transaction.PlatformTransactionManager
import org.springframework.transaction.support.TransactionTemplate
import org.springframework.transaction.support.TransactionCallback

class BootStrap {

     PlatformTransactionManager transactionManager

     def init = { servletContext ->

         def result = new TransactionTemplate(transactionManager)
                                        .execute({ status ->
             // setup Roles
             if (!Role.list()) {
                 log.error "added roles"
                     new Role(authority:"ROLE_USER").save()
             }
         } as TransactionCallback)
     }
     def destroy = {
     }
}

在0.1版,该插件可以完成:

  • 领域类的基本CRUD
  • 领域类的one-to-one、one-to-many、many-to-one和many-to-many关系
  • 支持Scaffolding
  • 结合acegi plugin,你可以保存自己的user、role和requestmap实现到neo4j中。由于缺省UserDetailsService依赖Hibernate的SessionFactory,要想让它工作,你必须自定义UserDetailsService。

如今,插件已经到了0.2版,该版本的特性:

  • 由Neo4j的领域类可以和传统的领域类(即由Hibernate映射的)共存
  • 升级到Neo4j 1.0
  • 利用Grails依赖注入,而非嵌入/lib目录的jar。
  • 增加检查Neo4j节点空间的单独控制器
  • 仿照couchdb插件,利用AST Transformation大幅重构代码
  • 支持Neo4j indexer
  • 支持未声明属性(non-declared properties)
  • 支持traversers

对于以上特性的细节,摘录如下:

  • 领域类共存:每个使用@Neo4jEntity标注的领域类将由Neo4j管理,该注解利用了AST Transformation。
  • 利用最新的依赖注入DSL,插件自己不再包含相应的jar。
  • 可视化节点空间的控制器,显示如下图:

Grails Neo4j插件0.2版发布

  • 支持Neo4j indexer:使用@Neo4jIndex标注想在其上建立索引的属性;在GORM的‘findBy <属性> ’或‘findAllBy <属性> ’方法在索引属性上被调用时,将会使用索引。

  • 支持未声明属性的示例:

    def car = new Car(licenseTag:'ABC123', color:'red')
    car.save()
    assert 'red' == car.color // declared property
    // N.B: numberOfSeats is _not_ declared
    assert null = car.numberOfSeats 
    car.numberOfSeats = 5
    assert '5' == car.numberOfSeats
    
  • 支持traversers:使用引用节点作为起点的DomainClass.traverse;使用domainClassInstance作为起点的 .traverse。代码示例如下:

    def traverser = car.traverse(
     { true },  // StopEvaluator
     // ReturnableEvaluator
     { it.currentNode().getProperty("color",null)=="red"} 
    )
    

详情请参见原文。另外提醒一下,在使用时请注意Neo4j的许可证协议,尤其是你打算用它开发商业应用的时候。

Neo4j……既有基于AGPLv3的开源版本,也有商业版本。如果在闭源软件中使用Neo4j则需要商业协议。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
MYSQL主从同步故障解决(主键重复)
MYSQL主从同步故障解决(主键重复)转载2010年04月05日18:52:00标签:mysql(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fso.csdn.net%2Fso%2Fsearch%2Fs.do%3Fq%
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这