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
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
def traverser = car.traverse( { true }, // StopEvaluator // ReturnableEvaluator { it.currentNode().getProperty("color",null)=="red"} )
詳情請參見原文。另外提醒一下,在使用時請注意Neo4j的許可證協議,尤爲是你打算用它開發商業應用的時候。
Neo4j……既有基於AGPLv3的開源版本,也有商業版本。若是在閉源軟件中使用Neo4j則須要商業協議。