介绍

新杂志365bet地区非常适合365bet地区应用程序的Graph数据库

GORM for Neo j的目标是提供尽可能完整将域类和实例映射到Neo j节点空间的GORM实现支持以下功能

  • 从Neo j Nodes编组到Groovy类型,然后再次返回

  • 支持GORM动态查找器条件和命名查询

  • 会话管理的交易

  • 使用Neo j的遍历功能

  • 通过Bolt Java驱动程序访问Neo j graph数据库

  • 新的自我营销

与GORM的Hibernate兼容性

此实现尝试与GORM for Hibernate尽可能兼容。通常,您可以参考GORM for Hibernate文档因为大多数功能都是同时实现的

GORM for Neo j支持以下主要功能

  • 简单的持久性方法保存删除等

  • 动态发现者

  • 条件查询

  • 命名查询

  • 遗产

  • 嵌入式类型

  • 通过示例查询

  • 可以使用映射类对多对多关联进行建模

但是不支持某些功能

  • HQL查询,但是Cypher查询是

  • 复合主键

  • 与Hibernate API的任何直接交互

  • 自定义休眠用户类型

可能这里还没有提到其他限制,因此通常不应期望基于GORM for Hibernate的应用程序可以在不进行任何调整的情况下正常工作。前面已经说过,支持大多数常见的GORM功能。

发行历史

X

  • Java最低要求

  • 支持Neo j Bolt驱动程序

  • 支持Neo j x

X

  • 支持Neo j Bolt驱动程序

  • 支持Neo j x

X

  • 支持分配的标识符

  • 使用分配的ID时,使用UNWIND和FOREACH批量插入

  • 支持将实体映射到Neo j Relationships

  • 支持查询Neo j路径

  • 支持列表基本类型

  • 升级到Neo j Bolt驱动程序

X

  • 支持Neo j x或更高版本

  • 为Neo j Bolt Java驱动程序重写

  • 支持多个数据源连接

  • DATABASE和DISCRIMINATOR方法的多租户支持

  • 重构自举

  • 使用新的DynamicAttributes特性

X

此版本中提供了以下新功能

  • 支持Neo j x或更高版本

  • 使用Cypher和默认GORM方法进行查询的能力find findAll

  • 强大的春季交易管理

  • 支持使用可选匹配的懒惰加载

  • 性能提升

  • 脏检查实施

如果您使用的是旧版插件,并且希望升级,则以下更改可能会影响您

  • Neo j JDBC不再使用,相应的CypherEngine接口也已删除

  • 默认情况下,动态关联是禁用的,您可以在实体映射中重新启用它们

X

  • 365bet地区针对Groovy特性365bet地区进行了重写

X

  • 初步支持Neo j x

  • 通过Neo j JDBC支持Cypher

X

  • 从x细化

X

  • 与Neo j HA合作

  • 实施新的GORM属性标准过滤器

  • 使用Neo j

  • 插件的第一个符合GORM的版本

  • 与嵌入式和REST Neo j数据库一起使用

  • 向域类公开遍历选项

从以前的版本升级

如果要从插件的早期版本升级到RELEASE,则需要考虑以下更改

删除365bet地区数据存储区很简单

grails数据存储简单grails资料储存库gorm测试依赖项已合并为一个grails资料储存库gorm测试依赖

不幸的是,365bet地区的现有版本仍然依赖于旧版本grails数据存储简单依赖关系并且您可能会收到诸如以下的错误

无法解决配置示例运行时的所有依赖关系找不到org grails grails数据存储区简单RELEASE在以下位置搜索https repo grails org grails核心org grails grails数据存储区简单RELEASE grails数据存储区简单RELEASE pom https repo grails org grails核心组织grails区域数据集简单的RELEASE grails数据存储区简单的RELEASE jar项目示例所需的组织org grails grails依赖项

如果您要升级,则需要在使用以下Gradle语法之前直接排除此依赖项依存关系

建立gradle
全部配置组态c c排除:'格拉斯',模组:'grails数据存储简单'依存关系

默认情况下本机标识符

由于GORM for Neo j默认使用本地节点和关系标识符作为ID,而不是先前的雪花ID生成策略。

grails gorm neo j默认映射ID发电机:'雪花'
}

配置变更

由于该插件现在使用Neo j Bolt驱动程序,因此配置已更改

grails neo j选项设置不再配置Neo j嵌入式选项,而是配置Bolt驱动程序选项

如果要继续以嵌入式模式配置Neo j,则必须使用grails neo j嵌入式选项.

螺栓Java驱动程序和API更改

API已更改,以适应Neo j Bolt驱动程序,并且已删除了对Neo j服务器本身的所有引用

因此,您需要用其等效的螺栓替换以下接口的用法

新J级 螺栓驱动器更换

org neo j graphdb GraphDatabaseService

org neo j driver v驱动程序

org neo j graphdb事务

org neo j driver v事务

org neo j graphdb节点

org neo j driver v类型节点

org neo j graphdb关系

org neo j driver v类型关系

org neo j graphdb结果

org neo j driver v StatementResult

您可能还需要替换引用的其他类。org neo j graphdb包被视为服务器端API,并且仅org neo j driver v包应在应用程序中使用

新Neo x变化

由于Neo j RELEASE的GORM是基于Neo j x的,因此,如果您要从Neo j x升级,则可能需要进行与Neo j相关的其他更改。升级指南在Neo j网站上

入门

365bet地区要开始使用针对Neo j的GORM,您需要将该插件安装到365bet地区应用程序中

365bet地区对于365bet地区 x,您需要编辑建立gradle文件并将插件添加为依赖项

建立gradle
依赖编译org grails插件neo j

如果您使用的365bet地区版本早于此版本,则可能需要强制执行GORM版本。如果您使用的365bet地区或更高版本,则可以通过修改gormVersion设置gradle属性:

gormVersion发布

否则,如果您使用的是较早版本的365bet地区,则可以通过在以下代码的正上方添加以下代码块来强制执行GORM版本:依存关系

建立gradle
配置所有解决方案策略eachDependency DependencyResolveDetails详细信息是否请求了详细信息组org grails详细信息请求的名称开始了with grails数据存储详细信息useVersion RELEASE依赖关系
365bet地区如果您想使用Neo j x,则对于Neo j的GORM需要365bet地区 x或更高版本,以及Neo j x或更高版本。x版本的GORM

365bet地区要为365bet地区 x配置插件,请编辑grails应用程序conf BuildConfig groovy文件并添加以下插件定义

插件编译neo j build tomcat
365bet地区在使用Neo j时,必须使用Tomcat配置365bet地区 x嵌入式的模式,因为Neo j服务器依赖于Servlet API的较新版本,因此不适用于Tomcat

365bet地区默认情况下,365bet地区插件假定您在端口上运行了Neo j实例7687但是,您可以通过在以下文件中包含以下配置来运行Neo j Embeddedgrails应用配置会议应用yml:

:
    新杂志:
        类型: 嵌入式的

然后将Neo j测试工具添加到您的提供依存关系

提供'org neo j test neo j线束'
365bet地区Neo j服务器使用Jetty,因此当您添加Neo j作为嵌入式365bet地区时,365bet地区还将使用Jetty而不是Tomcat作为容器,因为它是在类路径上发现的,因此不建议使用Neo j Embedded

要配置Neo j服务器网址,您可以使用grails neo j url设置grails应用配置会议应用yml:

:
    新杂志:
        网址: 螺栓本地主机

Neo j Bolt驱动程序配置选项

可以在以下选项中配置grails应用配置会议应用yml:

  • grails neo j urlNeo j Bolt URL

  • grails neo j buildIndex是否在启动时构建Neo j索引默认为true

  • 365bet地区 Neo J型Neo j服务器类型如果设置为嵌入式的加载嵌入式服务器

  • grails neo j冲洗模式使用Neo j会话时使用的刷新模式默认为汽车.

  • grails neo j用户名用于验证的用户名

  • grails neo j密码用于认证的密码

  • grails neo j默认映射默认数据库映射必须是在应用程序

  • grails neo j选项任何要传递给驱动程序的选项

grails neo j选项设置允许您配置以下属性org neo j driver v Config例如

:
    新杂志:
        选项:
            maxSessions: 100
            加密级别: 没有
            sessionLivenessCheckTimeout: 200

对于带有参数的构建器方法,将配置值设置为true将导致该方法被执行。例如,以下配置将导致ConfigBuilder with Encryption调用方法

:
    新杂志:
        选项:
            加密: 真正

对于带有多个参数的构建器方法,可以使用以下方法配置该方法的值ARG语法例如,以下配置将导致ConfigBuilder withConnectionTimeout调用方法

:
    新杂志:
        选项:
            连接超时:
                ARG: 10
                ARG: 

使用Neo j Standalone

如果您打算将Neo j用作主要数据存储,则需要通过编辑您的Hibernate插件来删除BuildConfig要么建立gradle365bet地区取决于365bet地区的版本并删除Hibernate插件定义

完成此操作后,grails应用程序域中的所有域类将通过Neo j而不是Hibernate持久化。您可以通过运行常规规则来创建域类创建域类命令

grails创建域 

域类将自动成为可存储在N​​eo j中的持久性实体

结合Neo j和Hibernate

如果您同时安装了Hibernate和Neo j插件,则默认情况下365bet地区应用程序域目录将由Hibernate而不是Neo j持久化。如果要使用Neo j持久化特定的域类,则必须使用mapWith域类中的属性

静态的mapWith"新杂志"

在Spring Boot中使用GORM

要在Spring Boot中将GORM用于Neo j,请将必要的依赖项添加到Boot应用程序中

编译org grails gorm neo j spring boot发布

确保您的启动应用该类带有注释组件扫描

进口 org springframework boot SpringApplication
进口 org springframework boot autoconfigure EnableAutoConfiguration
进口 org springframework上下文注释

组态
启用自动配置
组件扫描
 应用 {
    静态的 虚空主要[]args SpringApplication运行应用程序args
使用组件扫描如果没有值,则会导致引导程序扫描同一软件包或嵌套在软件包中的任何软件包中的类。应用类包如果您的GORM实体位于其他包中,则将包名称指定为组件扫描注解

最后创建您的GORM实体,并确保为它们添加注释grails持久性实体:

进口 grails gorm批注

实体
  {
    名字

要在Spring Boot中为Neo j配置GORM,请创建一个yml应用程序归档并填充您的组态其中的选项

不含365bet地区的Neo j的GORM

365bet地区如果您希望在365bet地区应用程序之外对Neo j使用GORM,则应声明必要的依赖项,例如在Gradle中

编译组织grails grails数据库存储gorm neo j RELEASE

然后使用grails gorm注释实体注释并实施节点特征

进口 365bet地区 Neo J
进口 grails gorm批注

实体
  实施节点{
    那么

然后,您需要将引导程序逻辑放置在应用程序中使用Neo jDatastore:

定义数据存储Neo jDatastore Person println人员计数

对于配置,您可以传递地图或实例org springframework core env PropertyResolver接口

定义数据存储Neo jDatastore'grails neo j url':'螺栓'人员打印数人员计数

如果您将Spring与现有产品一起使用ApplicationContext你可以打电话给useNeo jDataStoreSpringInitializer并打电话configureFor BeanDefinitionRegistry在刷新上下文之前,您可以通过Spring环境对象到构造函数进行配置

ApplicationContext myApplicationContext def初始化程序Neo jDataStoreSpringInitializer myApplicationContext getEnvironment人员初始化程序configureForBeanDefinitionRegistry myApplicationContext println人员计数

将域类映射到节点

365bet地区对于Neo j的GORM将把每个365bet地区域实例映射到节点空间中的一个节点。例如,给定以下域类

 宠物 {
    那么

每个域类都将实现新奥黛丽特质如果您更喜欢节点特质是新奥黛丽):

进口 grails neo j节点

 宠物 实施节点 {
    那么

当一个实例宠物已保存

定义p宠物那么:"迪诺"p保存齐平:真正)

然后是下面的密码创建发行

创建ñ宠物道具

该类的属性将转换为本地Neo j类型,并设置为道具查询参数

如果您想查看GORM针对Neo j生成的查询,则会启用org grails数据存储区gorm neo j

Neo j ID生成器

默认情况下,GORM对每个对象使用本机Neo j节点标识符ID域类的属性这些缺点有两个,应该鼓励您使用其他ID生成策略

  1. Neo j节点ID更像Neo j使用的内部标识符来标识与行号在SQL数据库中,但是如果删除并重新创建数据,则有可能被重用。这使它们不适合用作公开密钥

  2. 为了获得节点ID,如果ID生成策略是自动递增列,则GORM必须执行类似于GORM for Hibernate必须执行SQL INSERT的插入方式,这意味着它无法有效地批处理Cypher创建陈述

最后一个缺点可以通过使用保存全部一次保存多个域类的方法

俱乐部SaveAll俱乐部那么:"曼联"),
    俱乐部那么:"兵工厂")
])

但是,通常最好考虑使用其他id生成策略

分配的标识符

推荐的方法是使用已分配与您的域相关的标识符,例如

 所有者 {
    那么静态的有很多宠物宠物静态的映射节点ID发电机:'已分配', 那么:'那么'
    }
}
 宠物 {
    那么静态的属于所有者:所有者]
    静态的映射节点ID发电机:'已分配', 那么:'那么'
    }
}

使用分配的标识符,GORM可以更好地优化写操作,例如以下逻辑

 所有者(那么:"弗雷德"addToPets那么: "迪诺"addToPets那么: ""保存 所有者(那么:"巴尼"addToPets那么: "跳跳"保存齐平:真正)

GORM将生成以下Cypher

UNWIND ownerBatch作为行CREATE owner所有者SET所有者行道具FOREACH宠物IN row pets创建宠物Pet宠物SET宠物道具MERGE owner PETS宠物

注意如何放松前瞻用于一次创建实体及其关联,大大提高了大型数据集的写入性能

雪花标识符

另一个选择是基于Snowflake算法的自定义身份生成器,并将生成的标识符存储在每个Neo j节点的属性中,该属性称为ID:

进口 静态的 grails neo j映射MappingBuilder
 俱乐部 {
    名称静态映射节点ID生成器"雪花"
        }
    }

}

全球变化的身份战略

如果您希望全局更改ID生成,则可以在grails应用配置会议应用程序 (配置槽365bet地区在365bet地区 x中

grails neo j默认映射ID发电机:'已分配'
}

自定义标识符

此外,如果您希望使用自定义身份生成策略,则可以通过指定实现IdGenerator接口

grails neo j默认映射ID发电机:'与foo MyIdGenerator'
}

了解关联映射

GORM for Neo j将根据GORM映射中定义的关系所有权规则为您在节点之间创建Neo j关系。例如,以下映射

 所有者 {
    那么静态的有很多宠物宠物 宠物 {
    那么静态的属于所有者:所有者]
}

保存关系时

 所有者(那么:"弗雷德"addToPets那么: "迪诺"保存齐平:真正丢弃

保存方法将生成Cypher关系创建查询,如下所示

从所有者到宠物的匹配,从开始的ID和ID到从宠物到的最终合并

从查询中可以看到,关系定义为从PETS到关联的方向由谁拥有关联定义宠物定义一个属于关联到所有者这意味着所有者拥有协会,关系来自所有者宠物.

您可以使用来自定义Neo j关系类型和方向映射必要时阻止

进口 静态的 grails neo j方向

 所有者 {
    那么静态的有很多宠物宠物静态的映射宠物类型:"PETZ", 方向

在这种情况下,将在图中创建双向关系,例如从PETZ到.

有关定义与GORM关系的更多信息,请参见GORM文档中的相应指南.

自定义标签策略

定义标签的默认策略是使用类名,但是为给定节点定义标签的策略是完全可配置的。例如,您可以使用静态映射来定义标签

  {
    静态的映射标签"", ""
    }
}

您还可以动态定义标签,例如

  {
    静态的映射标签GraphPersistentEntity pe"`${pe javaClass名称}`" }
    }
}
动态标签对写入性能有负面影响,因为GORM无法使用动态标签进行批处理操作,因此应谨慎使用

或混合使用静态和动态标签

静态的映射标签""GraphPersistentEntity"`${pe javaClass名称}`" }
}

您可以以读写性能为代价来基于实例定义动态标签

静态的映射标签GraphPersistentEntity pe实例参数实例依赖标签
        "`${实例职业}`"
    }
}

动态属性和关联

Neo j是一个无模式的数据库,这意味着与SQL不同的是,SQL中只能有固定数量的行和列节点,可以具有无限个属性

大多数现有的静态类型语言对象映射工具都不允许您利用此功能,但是GORM for Neo j允许您定义静态定义的属性,即域类的属性和域属性

例如下面的域类

  {
    那么

您可以同时设置静态定义的那么属性,还可以使用Groovy中的下标运算符来获取任意数量的动态属性

定义p那么:"胡萝卜"p'gosInPatch'] = 真正p保存齐平:真正)

可以包含任何简单的属性,但是,如果您希望具有动态关联,也可以通过修改映射来实现

  {
    那么静态的映射dynamicAssociations真正
    }
 }

通过此操作,您可以定义动态关联

定义p那么:"胡萝卜"p'有关'] = [ 那么:"土豆"保存p保存齐平:真正)
动态关联会产生运行时性能成本,因为当您访问任何动态属性时,如果该值为空,则GORM必须发出单独的查询来检索该关联,请谨慎使用

将域类映射到关系

除了能够将域类映射到Neo j节点因为您能够将域类映射到Neo j关系.

例如考虑以下领域模型

进口 365bet地区 Neo J

 电影 {
    标题静态的有很多剧组成员 剧组成员 实施关系 {
    清单<角色[]
}

  {
    那么静态的有很多出场剧组成员

剧组成员类实现关系具有两个通用参数的特征代表关系开始的类和代表结束的类

然后,您可以使用常规的GORM方法来查询剧组成员关系另外,由于Neo j关系是动态的,因此您可以在运行时为其分配其他属性,例如

定义剧组成员剧组成员: 那么: "基努"),
    : 电影标题: "矩阵"),
    角色: [""剧组成员'真正的名字'] = "托马斯·安德森"castMember保存齐平:真正)

在上面的示例中角色属性和动态属性一样另存为关系的属性真正的名字属性

然后,您可以使用这些属性查询关系

CastMember厘米CastMember findByRoles''从println人名起的人人cm

上面的示例将生成一个Cypher查询,该查询查询关系而不是节点

MATCH n从CASTMEMBER到电影WHERE的人r角色RETURN r从para到as到paras Neo

控制关系类型

您将从上一个示例中注意到,关系类型为剧组成员.

默认情况下,GORM使用类名作为关系类型。您可以使用映射必要时阻止

进口 365bet地区 Neo J
进口 静态的 grails neo j映射MappingBuilder

静态的映射关系类型"加入"方向方向外向

上面的示例还演示了如何配置方向关系的

您还可以为每个实例分配关系类型,以覆盖默认类型

定义剧组成员剧组成员类型: "直接"
    : 那么: "拉娜·沃卓斯基(Lana Wachowski)"),
    : 电影标题: "矩阵"保存齐平:真正)

然后在查询中使用类型

清单导演CastMember findAllByType"直接")

查询和关系

通常,所有类型的GORM查询都可与关系一起使用。关系的属性,使查询和使用投影成为可能

查询关系的任何其他属性时,将查询关系的属性但是,将查询构成关系两端的节点

考虑这个查询

清单keanuCastings CastMember名称来源"基努"清单

以上哪里查询将产生以下密码查询

从人r ACTED IN到电影WHERE从名称RETURN r的匹配

请注意可以查询关系的结尾,也可以将投影应用于关联例如

分离标准baseQuery CastMember来自名称的位置"基努"
} (1)
整型totalKeanuMovies baseQuery预测countDistinct"到标题"得到(2)

清单<keanuMovieTitles baseQuery属性'到标题'清单(3)
1 创建一个分离标准询问
2 使用投影来获取电影标题的总数
3 使用项目仅获取电影标题

用GORM查询Neo j

GORM for Neo j支持GORM提供的所有不同查询方法,包括

但是不支持HQL查询,如果您愿意,可以直接使用Cypher

如果您想查看GORM针对Neo j生成的查询,则会启用org grails数据存储区gorm neo j

了解延迟加载

默认情况下,在检索GORM实体及其关联时,单端关联将仅检索关联ID,而与许多对象的关联直到被访问才完全不检索该关联。这称为延迟加载

例如给出以下领域模型

 联盟 {
    那么静态的有很多俱乐部俱乐部 俱乐部 {
    那么静态的属于联盟联盟静态的有很多团队球队 球队  {
    那么静态的属于俱乐部俱乐部

当您检索俱乐部按名字

定义俱乐部俱乐部findByName"曼联")

您将获得以下Cypher查询

比赛n俱乐部WHERE ID n RETURN n作为数据

如您所见团队关联未加载到查询中,并且联盟关联请注意,如果要进行联盟关联可为空

 俱乐部静态归属于联盟联盟静态的约束联盟可为空:真正
 }
}

这会将执行的查询更改为

比赛n俱乐部WHERE ID n可选比赛n联赛LeagueNode RETURN n作为数据收集DISTINCT ID LeagueNode作为LeagueIds

请注意,只有联盟检索关联

原因ID检索关联实体的名称是为了区分关联是否存在空值您可以通过以下方式恢复以前的行为:联盟协会:

 俱乐部静态归属于联盟联盟静态的约束联盟可为空:真正
 }
 静态的测绘联盟:真正
 }
}

但是,如果您要访问联盟协会,这是空值你会得到一个例外

使用所有这些方法,如果您随后遍历团队,您将获得第二个查询以获取团队

对于球队俱乐部球队println球队名称

生成的查询将是

比赛俱乐部团队小组WHERE ID从ID RETURN到数据

如果您希望避免通过该次要查询来检索数据,则可以使用快速查询来完成。

使用动态取景器
定义俱乐部俱乐部findByName"曼联", [:[团队:'加入']])

使用where查询
定义查询俱乐部名称"曼联"加入'团队')
定义俱乐部查询使用标准
定义查询Club createCriteria定义俱乐部查询获取等式'那么', "曼联"加入'团队'
}

相反,它将生成以下查询

比赛n俱乐部所在位置n可选比赛n团队teamNode具有n收集不同的teamNode作为teamNodes返回n作为数据teamNodes

如您所见,查询已加载了关联的团队节点。如果您希望每个查询都发生这种情况,那么也可以在映射中进行配置

 俱乐部静态地图团队:"急于"
    }
}

您还可以将集合ID配置为急于加载,但将实例本身通过代理延迟加载

 俱乐部静态地图团队:"急于", :真正
    }
}

用Cypher查询

要使用原始Cypher查询进行查询,您可以使用内置的找到所有方法

定义俱乐部俱乐部发现"匹配n其中n名称返回n", '拜仁慕尼黑足球俱乐部')
定义俱乐部俱乐部findAll"匹配n其中n名称返回n", '拜仁慕尼黑足球俱乐部')

请注意,第一个返回的项目应该是节点本身。要执行密码查询并处理原始结果,请使用executeCypher:

StatementResult结果Club executeCypher"匹配n其中n名称返回n", ['拜仁慕尼黑足球俱乐部'])

或者您可以使用executeQuery这将返回结果列表

清单节点Club executeQuery"匹配n其中n名称返回n", ['拜仁慕尼黑足球俱乐部'])

处理原始结果时,您可以转换任何org neo j driver v类型节点使用关键词

所以我的Cぅb cぅb我的俱乐部
这也适用于关系路径类型

您还可以转换任何org neo j driver v StatementResult实例到域类列表

StatementResult结果列表俱乐部结果到俱乐部

定义查询索引

要定义应该为查询建立索引的领域类的属性,可以在映射中进行

 俱乐部 {
    名称静态映射名称指数:真正
    }
}

在启动时,GORM将使用Cypher创建索引,如下所示

在俱乐部名称上创建索引

定义唯一索引使用独特代替

 俱乐部 {
    名称静态映射名称独特:真正
    }
}

查询路径

由于GORM for Neo j功能支持Neo j路径查询,要使用路径查询,您必须实现grails neo j节点域类中的特征例如,给出以下类

EqualsAndHashCode包括'那么')
  实施节点 {
    那么静态的有很多朋友们静态的映射节点ID发电机:'已分配', 那么:'那么')
    }
}

以及以下设置数据

人乔那么: ""人巴尼那么: "巴尼"addToFriends乔人弗雷德那么: "弗雷德"addToFriends巴尼

这样可以创建一个朋友图,从而可以找到从一个朋友到另一个朋友的最短路径。findShortestPath返回一个方法grails neo j路径实例

路径路径Person findShortestPath fred joe15)
对于路径段分割路径println段开始名称println段结束名称

您还可以找到最短路径,而无需先使用代理加载实体

路径路径Person findShortestPath Person代理"弗雷德"人代理""), 15)
对于路径段分割路径println段开始名称println段结束名称

最后,还可以使用Cypher查询来查找路径

"弗雷德"
""路径路径Person findPath"从人到人的匹配p最短从名称到人的路径$AND命名$返回p")
对于路径段分割路径println段开始名称println段结束名称

查询关系

自从GORM for Neo j功能支持Neo j关系查询以来,除了能够查询路径之外,要使用路径查询,您还必须实现grails neo j节点域类中的特征例如,给出以下类

EqualsAndHashCode包括'那么')
  实施节点 {
    那么静态的有很多朋友们静态的映射节点ID发电机:'已分配', 那么:'那么')
    }
}

您可以使用以下查询找到两个实体之间的关系

"弗雷德"
"巴尼"关系rel Person findRelationship Person代理从Person代理到

参数可以是检索到的实例,也可以是卸载到节点的代理

以这种方式查询关系不如使用关系实体灵活将实体映射到关系.

您还可以找到两个实体之间的所有关系

"弗雷德"
"巴尼"
清单<>关联Person findRelationships Person代理从Person代理到

或者找到两个实体类型之间的所有关系

清单<>关系人员查找关系人员人员最大值:10])
对于rel铁路印花"类型${相对类型}"打印"${靠名字}${相对于名字}")
}

适用于Neo j数据服务的GORM

额外的支持GORM数据服务除了GORM core所提供的功能外,Neo j的GORM中还存在

例如,如果您声明数据服务接口

服务接口人员服务

您可以使用暗号注释以自动实现执行Cypher查询的方法

暗号("""比赛${来自的人},${人到}p shortestPath$)-[*..15]-($哪里$那么$开始$那么$结束返回p"""路径findPath开始结束

注意如何在Cypher查询中使用类名,它将正确地将声明转换为适当的节点比赛声明

内的变量引用暗号字符串声明也在编译时检查

您还可以自动实施Cypher更新操作

暗号("""比赛${人p}哪里$p那么$那么设定年龄$年龄""")
虚空updatePerson那么整型年龄

最终也支持实现查找路径的方法,例如

路径findPerson从Person到

测试中

编写将GORM用于Neo j的单元测试相对比较简单。如果您希望使用Neo j的嵌入式版本,只需添加新j线束对你的依赖建立gradle文件

建立gradle
testRuntime org neo j测试neo j工具

然后创建一个斯波克规范并声明一个共享字段使用Neo jDatastore具有要测试的域类的构造函数

共享 自动清理Neo jDatastore数据存储Neo jDatastore getClass getPackage
自动清理批注将确保测试完成后正确关闭数据存储

如果测试与域类位于同一软件包中,则还可以设置软件包扫描,而不是对每个域类名称进行硬编码

共享 自动清理Neo jDatastore数据存储Neo jDatastore getClass getPackage

然后用注释每个测试方法grails gorm事务回滚注解

回滚
虚空 "测试一些"() {

}

多个数据源

GORM for Neo j支持多个数据源的概念,其中多个单独的Bolt司机实例可以配置和切换

配置多个螺栓驱动程序

配置多个螺栓司机您需要使用的连接365bet地区 Neo J联系设置例如yml应用程序:

grails应用配置会议应用yml
:
    新杂志:
        网址: 螺栓本地主机
        连接数:
            更多书籍:
                网址: 螺栓本地主机
            更多书籍:
                网址: 螺栓本地主机

您可以为每个Bolt驱动程序配置单独的设置如果默认情况下未指定设置,则该设置将从默认的Neo j驱动程序继承

将域类映射到螺栓驱动程序

如果域类没有指定的Neo j驱动程序连接配置,则使用默认值

您可以设置连接中的方法映射块以配置备用Neo j驱动程序

例如,如果您想使用邮政编码域以使用称为的Neo j Driver连接抬头像这样配置

 邮政编码 {

   静态的映射连接'抬头'
   }
}

域类还可以通过使用两个或多个配置的Neo j Driver连接连接数具有名称列表的方法,例如,可以配置多个名称

 邮政编码 {

   静态的映射连接'抬头', '审核'])
   }
}

如果域类使用默认连接,并且一个或多个其他连接,则可以使用ConnectionSource默认常数表示

进口 组织grails数据存储区映射核心连接

 邮政编码 {

   静态的映射连接'抬头'ConnectionSource默认

如果域类使用所有已配置的数据源实例使用值所有:

进口 组织grails数据存储区映射核心连接

 邮政编码 {

   静态的映射连接ConnectionSource ALL

在螺栓驱动器之间切换

您可以在运行时使用以下命令切换到其他连接:withConnection方法

withConnection"更多书籍"清单
致电清单不应以因为这将使用默认连接

在闭包主体内执行的任何逻辑都将使用备用连接。关闭完成后,GORM将自动切换回默认连接

多租户

GORM for Neo j支持以下多租户模式

  • 数据库具有单独连接池的单独数据库用于存储每个租户数据

  • 判别器同一数据库与用于区分和隔离数据的鉴别器一起使用

配置多租户

您可以按照GORM for Hibernate文档只需指定多租户模式和解析器

:
    蓝色的:
        多租户:
            模式: 数据库
            tenantResolverClass: 组织grails数据存储区映射多租户Web SubDomainTenantResolver

请注意,如果同时使用Neo j和Hibernate,则上述配置将同时配置Neo j休眠以使用多租户模式数据库.

如果只想为Neo j启用多租户,则可以使用以下配置

:
    新杂志:
        多租户:
            模式: 数据库
            tenantResolverClass: 组织grails数据存储区映射多租户Web SubDomainTenantResolver

多租户模式

如前所述,Neo j的GORM支持数据库判别器但是要记住一些注意事项

每个租户的数据库

使用时数据库模式下,只有GORM方法调用被调度到正确的租户。这意味着以下将使用租户ID

根据租户ID切换到正确的客户端
清单

但是直接通过司机不管用

自动接线 司机boltDriver使用默认连接并且不解析租户boltDriver会话运行"..")

如果您直接与司机实例,您需要确保获得正确的实例。例如

进口 365bet地区 Gorm多租户

自动接线Neo jDatastore neo jDatastore驱动程序boltDriver neo jDatastore getDatastoreForTenantId租户currentId getBoltDriver

分区多租户

使用时判别器GORM for Neo j的方法将存储一个tenantId每个Neo j节点中的属性,并尝试对数据进行分区

这再次仅在使用GORM方法时有效,即使在某些情况下,如果您使用本机Neo j接口也无法使用

例如以下工作正常

在查询中正确包含tenantId
清单

像这样

如果在查询中包含tenantId,则会自动工作
"在p本书中找到p标题,而p出版商tenantId返回p", [那么:"展台"]")

但是此查询由于缺少租户ID而引发异常

"比赛p书籍WHERE p标题title RETURN p", [那么:"展台"])

另外,如果直接获取驱动程序,则租户ID将不包含在查询中

自动接线 司机boltDriver使用默认连接并且不解析租户boltDriver会话运行"比赛p书籍WHERE p标题title RETURN p", [那么:"展台"]")

由于您是直接在驱动程序上进行操作,因此无法知道何时执行应由多租户识别的查询

在这种情况下,您必须确保包括tenantId手动地

boltDriver会话运行"在p本书中找到p标题,而p出版商tenantId返回p",
                [那么:"展台", tenantId租户currentId

写入操作(例如使用本机API完成的插入操作)也是如此

Neo j Java驱动程序API的增强功能

适用于Neo j的GORM包含对Neo j Bolt Driver API的一些增强

从节点获取属性

点运算符可用于从节点获取属性

节点节点def值节点myProperty要么

定义价值节点'我的财产']

将节点投射到地图

节点可以投射到地图

所以,我的妈妈,所以 地图

参考

其他Gorm方法

暗号

目的

执行密码查询

设定:
定义名字: "鲍勃", : "建造者")
定义petType宠物类型那么: "")
定义宠物宠物那么: "弗雷德", 类型petType所有者人人addToPets宠物人保存齐平: 真正会话清除什么时候:
定义结果人密码"开始n个节点,此匹配项n个宠物,m个返回m")

然后结果迭代器大小1
描述

暗号在任何域实例上调用并返回一个org neo j driver v StatementResult

传递的参数是

  • 密码查询字符串查询字符串可能使用隐式这个指向实例节点的参数

  • 密码参数的可选映射

静态

目的

执行密码查询

设定:
:''保存:''保存会话刷新会话清除什么时候:
定义结果人cypherStatic"开始n个节点,此匹配项n个INSTANCE m,其中m个姓氏的人返回m")

然后结果迭代器大小1
描述

静态在任何域类上调用并返回一个org neo j driver v StatementResult

传递的参数是

  • 密码查询字符串查询字符串可能使用隐式这个指向域类的aka子引用节点的参数

  • 密码参数的可选映射

无模式属性

目的

对于Neo j映射的域类,您可以通过在点实例上使用点运算符或映射语义来在实例上放置和获取任意属性

一个简单的领域类

  实施 可序列化 {
    名字整数年龄0
}
使用地图语义
什么时候:
定义:''救人'notDeclaredProperty'] = 'someValue'   n b点表示法对于未声明的属性无效'空数组'] = []'someIntArray'] = [1,2,3'someStringArray'] = ['一种', 'b', 'C''someDoubleArray'] = [0.9, 1.0, 1.1会话冲洗会话清除人员人员获取人员ID然后'notDeclaredProperty'] == 'someValue'''] == ''  声明的属性也可以通过地图语义获得'someIntArray'] == [1,2,3'someStringArray'] == ['一种', 'b', 'C''someDoubleArray'] == [0.9, 1.0, 1.1]
使用点运算符
什么时候:
定义:''保存齐平:真正会话清除人员人员加载人员ID人员notDeclaredProperty'someValue'   n b点表示法对于未声明的属性无效人emptyArray[]人someIntArray1,2,3人someStringArray'一种', 'b', 'C'人someDoubleArray0.9, 1.0, 1.1会话冲洗会话清除人员人员获取人员ID然后未申报的人'someValue'人姓''  声明的属性也可以通过地图语义获得人someIntArray1,2,3人someStringArray'一种', 'b', 'C'人emptyArray[]人someDoubleArray0.9, 1.0, 1.1]
描述

非声明的属性在域实例的节点上存储有常规属性。无模式属性的值必须是Neo j属性的有效类型,即字符串原语和前两个数组