Grails Neo4j插件0.2版發佈

Stefan Armbruster在本身的Blog上公佈了Grails Neo4j插件0.2版發佈的消息spring

前些時候InfoQ中文站已經報導了Neo4j 1.0的發佈。Neo4j是一款基於Java的NoSQL圖形數據庫:數據庫

相對於關係數據庫來講,圖形數據庫善於處理大量複雜、互鏈接、低結構化的數據,這些數據變化迅速,須要頻繁的查詢——在關係數據庫中,這些查詢會致使大量的錶鏈接,所以會產生性能上的問題。 dom

Neo4j有3個基本構建塊:性能

  • Node(又叫作vertex)——從概念上來講,這相似於對象實例,擁有惟一的ID。
  • Relationship(又叫作edge)——它鏈接了兩個Node,此外還有方向和RelationshipType。
  • Property(又叫作attribute)——他們是字符串類型的key/Object值對,Node與Relationship都有Property。

雖然Neo4j 1.0版最近發佈不久,但它的Grails插件早在去年10月就已經出現了,按照Stefan Armbruster的說法:lua

這個插件能夠在Grails應用中透明的使用。你只須要作一件事情:移除Hibernate插件,安裝neo4j插件。hibernate

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版,該插件能夠完成:code

  • 領域類的基本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版,該版本的特性:component

  • 由Neo4j的領域類能夠和傳統的領域類(即由Hibernate映射的)共存
  • 升級到Neo4j 1.0
  • 利用Grails依賴注入,而非嵌入/lib目錄的jar。
  • 增長檢查Neo4j節點空間的單獨控制器
  • 仿照couchdb插件,利用AST Transformation大幅重構代碼
  • 支持Neo4j indexer
  • 支持未聲明屬性(non-declared properties)
  • 支持traversers

對於以上特性的細節,摘錄以下:orm

  • 領域類共存:每一個使用@Neo4jEntity標註的領域類將由Neo4j管理,該註解利用了AST Transformation。
  • 利用最新的依賴注入DSL,插件本身再也不包含相應的jar。
  • 可視化節點空間的控制器,顯示以下圖:
  • 支持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則須要商業協議。

相關文章
相關標籤/搜索