365bet地区使用365bet地区和Neo j构建Graph应用程序

365bet地区本指南演示了如何使用365bet地区和GORM构建Neo j Movies示例应用程序

s格雷姆·罗彻(Graeme Rocher)

365bet地区版本 3.3.0

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

在本指南中,您将学习如何构建Neo j电影示例应用程序这在多种语言作为使用Neo j的官方示例应用程序

对于那些不熟悉Neo j的人图形数据库在传统的关系数据库上优化图遍历的速度相对较慢

GORM for Neo j的目标是简化具有Neo j节点和关系的现有Groovy域模型的映射

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

您还需要下载并安装

对于Mac Neo j,DMG包含Neo j服务器,只需将其直接安装到您的应用领域

新应用
对于Windows,可执行安装程序将安装Neo j服务器并从开始菜单中使其可用。对于nix操作系统,您可以使用.

Neo j服务器应用程序运行后,指定数据目录,然后单击“开始”按钮

新开始

这将在默认端口启动Neo j7474

新j本地主机

现在您可以使用默认的用户名和密码登录Neo j新杂志新杂志:

新密码

提示您登录后,将要求您更改密码将本教程的值更改为电影

新密码

如何完成指南

要开始,请执行以下操作

要么

  • 克隆资料库
    去克隆

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指导neo j电影初始

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入

开始之前,要做的第一件事是填充数据模型。为此,请转到以下位置的Neo j浏览器http本地浏览器和类型播放电影:

新电影

这将调出预览领域模型暗号陈述创建陈述

Cypher是Neo j使用的查询语言。例如,以下语句在图中创建两个新的Neo j节点,分别表示一个电影另一个代表一个):

CREATE TheMatrix电影标题Matrix发布的标语欢迎来到现实世界CREATE Keanu人名Keanu Reeves出生

表达式左侧的值黑客帝国电影是节点名,就像变量名一样,并且不存储在数据库中

右边的值是节点在这种情况下贴上标签电影).

大括号内的值是节点属性

可以在以后的语句中使用节点的名称来创建节点之间的关系

创建Keanu担任角色Neo TheMatrix

以上创建语句在基努节点和黑客帝国节点关系类型为加入在这种情况下,类似节点的关系可以具有属性角色属性

单击代码以将其填充到Neo j浏览器编辑器中

新j clickcode

这将放置必要的暗号语句将填充到Neo j浏览器编辑器中,该语句将填充示例数据库。然后,您可以按“播放”按钮以运行代码,并且在下面的窗口中将显示数据库模型的图形可视化

新j运行代码

为Neo j配置GORM

365bet地区首先,本指南是使用GORM RELEASE构建的,因此,为了完成本指南,我们必须首先将365bet地区配置为使用GORM RELEASE

为此,请设置gormVersion财产gradle属性发布

gradle属性
grailsVersion gormVersion释放新的jVersion gradleWrapperVersion

建立gradle已经包含了对neo j插件的依赖,您将需要修改新杂志依赖也使用GORM RELEASE

建立gradle
编译"org grails插件Neo j"

现在,修改已存在的neo j配置块grails应用配置会议应用yml文件配置Neo j连接设置以使用您之前设置的电影密码

grails应用配置会议应用yml
ils:
    新杂志:
        网址: 螺栓本地主机
        用户名: "新杂志"
        密码: "电影"

编写申请

如本指南前面所述,您将实现Neo j电影示例应用程序Neo j网站描述了以下示例

这是一个简单的单页Web应用程序,使用Neo j的电影演示数据库电影演员导演作为数据集。所有应用程序中的同一前端网页使用由后端提供的REST端点,这些端点以不同的编程语言和驱动程序实现
Neo J com

要实现的REST端点是

  • 按标题列出单个电影

  • 按标题搜索电影

  • 域的图形可视化

定义GORM域模型

现在您已经正确配置了GORM,下一步是定义一个映射Neo j图的域模型

为此,我们将创建域类来表示域模型中的两种类型的节点。您可以使用创建域类CLI命令或您喜欢的IDE或文本编辑器

grails创建域类neo j电影Moviegrails创建域类neo j电影Movie

此外,我们将创建一个域类来对关系在两个领域类之间剧组成员:

grails创建领域类Neo j电影CastMember

现在打开域类位于grails应用程序域neo j电影Person groovy并将内容修改为如下所示

grails应用程序域neo j电影Person groovy
新电影 365bet地区grails编译器365bet地区CompileStatic

在图形数据库中对Person节点建模
365bet地区365bet地区CompileStatic
  {
    整型天生的静态的出场剧组成员静态的约束名称空白:天生的:1900
    }
}

如您所见有一个出生一年并与剧组成员以后再说

现在打开电影域类位于grails应用程序域neo j电影Movie groovy并将内容修改为如下所示

grails应用程序域neo j电影Movie groovy
新电影 365bet地区grails编译器365bet地区CompileStatic

在图形数据库中建模电影节点
365bet地区CompileStatic
 电影 {
    标题标语整型已发布静态的剧组成员静态的释放约束:1900标题空白:
    }
}

一种电影有一个标题一种标语发布并且还具有与剧组成员.

剧组成员域类将为模型之间的关系建模还有一个电影为此,我们将使用关系特质,它允许我们将域类映射到Neo j关系而不是节点

grails应用程序域neo j电影CastMember groovy
新电影 关系
 常规转换CompileStatic

模拟人物和电影之间的关系
静态编译
 剧组成员 实施关系 { (1)

    清单<角色[] (2)CastMember类型RoleType ACTED IN(3)
    }

    静态的 枚举角色类型(4)行动方向
1 关系特质需要通用参数实体与实体
2 在这种情况下,关系实体也可以具有属性角色属性
3 我们将默认关系类型设置为加入
4 关系类型用角色类型枚举

实施REST端点

如前所述,要实现的REST端点是

  • 按标题列出单个电影

  • 按标题搜索电影

  • 域的图形可视化

电影控制器您可以使用ils365bet地区应用控制器Neo J电影名称以结尾的目录控制者:

grails创建控制器新j电影MovieController

控制器的初始内容应如下所示

静态编译
 电影控制器 {
    静态的responseFormats'json', 'XML文件']
   ...
}

要将各种端点映射到控制器,请将以下内容添加到grails应用程序控制器Neo J电影UrlMappings groovy文件

grails应用程序控制器Neo J电影UrlMappings groovy
        "电影$标题"(控制者: '电影', 行动: '') (1)
        ''(控制者: '电影', 行动: '') (2)
        '图形'(控制者: '电影', 行动: '图形') (3)
1 电影标题动作的URI电影控制器
2 动作的URI电影控制器
3 图形动作的URI图形电影控制器

当然,这些控制器动作均未实现,让我们从第一个要求开始

按标题查找端点

找一个工具电影GORM数据服务电影服务

您可以使用ilsgrails应用服务neo j电影名称以结尾的目录服务:

grails创建服务新j电影MovieService

提供服务并添加服务对其进行注释以告知GORM该服务应自动实施

grails应用程序服务新j电影MovieService groovy
 grails gorm services服务
 常规转换CompileDynamic
 常规转换CompileStatic

(['未使用的变量', 'OpenAfterBrace之后的空格', 'SpaceBeforeClosingBrace'])
静态编译
服务电影  电影服务 {
   ...
}

方法称为电影服务这需要标题

grails应用程序服务新j电影MovieService groovy
('')
电影查找标题

GORM会自动为您实施该方法,但请注意,我们使用注释,表明我们要获取使用相同查询的关联

现在,让我们实现将调用此方法的控制器操作,首先将服务注入到电影控制器

MovieService movieService

这使用Spring注入依赖关系并使服务实现可用接下来添加一个名为调用

定义 (标题响应movieService查找标题

如果现在运行该应用程序并转到http localhost电影The Matrix Reloaded为了简洁起见,您会看到以下回复

{
  "": [...],
  "ID": 9,
  "已发布": 2003,
  "标语": "释放你的心灵",
  "标题": "重装上阵"
}
如果您想调试执行的Cypher查询GORM,请为org grails数据存储区gorm neo j包装在365bet地区应用程序配置会议日志回切

不幸的是,尽管有效的JSON并不是实现Neo j示例应用程序所需的确切格式

要自定义JSON,请创建一个grails应用程式观看电影电影gson JSON视图并用以下内容填充

grails应用程式观看电影电影gson
 常规转换场
 新电影j电影

领域电影电影(1)json标题电影标题(2)演员'剧组成员'电影演员(3)
}
1 定义电影在模型中渲染
2 输出电影标题为JSON
3 为演员表的每个成员渲染另一个模板

致电tmpl演员需要定义第二个模板。模板名称空间使用方法名称来调用名称相同的模板。因此,在这种情况下,我们需要创建一个grails应用程序观看电影演员吉森模板

grails应用程序观看电影演员吉森
 常规转换场
 新j电影CastMember

领域演员表演员表成员json工作演员表会员类型拆分"_")[0toLowerCase从名称角色转换为成员角色的名称转换成员

杰森模板格式剧组成员关系,其格式为JSON现在,如果您运行该应用程序并访问与前面所述相同的URL,则结果输出将采用正确的JSON格式,以简化起见

{
  "标题": "重装上阵",
  "": [
    {
      "工作": "行动了",
      "": "凯莉·安妮·莫斯",
      "角色": [
        "三位一体"
      ]
    },
    {
      "工作": "行动了",
      "": "基努·里维斯",
      "角色": [
        ""
      ]
    },
    ...
  ]
}

完成第一个端点后,让我们实现搜索

搜索端点

搜索端点允许客户端按标题搜索电影,而无需知道确切的标题。要实现持久性逻辑,请向电影服务实现搜索逻辑

grails应用程序服务新j电影MovieService groovy
清单搜索q整型限制100) { (1)
    清单结果如果q结果电影标题"%${q}%"  (2)清单最大值限制其他结果[] (3)结果
1 方法需要一个查询参数和一个限制取得最大效果的参数
2 一种哪里查询与GORM转换成Cypher的like表达式结合使用内含物询问
3 如果未指定查询,则返回一个空列表

执行查询时,将生成以下Cypher

匹配n电影在哪里n标题包含返回n作为数据限制

{1}{2}命名参数由参数填充,以确保正确的转义并防止注入攻击

此示例还演示了GORM Data Services的重要概念,您可以将其混合使用。GORM使用自定义逻辑自动实现的方法

现在让我们实现将调用此方法的控制器操作

定义 (q响应movieService搜索q

最后端点以不同的JSON格式将结果返回给端点,所以我们创建一个grails应用程序观看电影搜索gson查看格式化JSON结果

grails应用程序观看电影搜索gson
 常规转换场
 新电影j电影

领域 可迭代的电影列表[]json movieList电影已发行电影电影已发行标语电影标语标题电影标题

如果您现在去http本地主机搜索q矩阵URL生成的JSON看起来像

[
  {
    "已发布": 1999,
    "标语": "欢迎来到真实的世界",
    "标题": "矩阵"
  },
  {
    "已发布": 2003,
    "标语": "释放你的心灵",
    "标题": "重装上阵"
  },
  {
    "已发布": 2003,
    "标语": "一切都有起点的都有终点",
    "标题": "黑客帝国革命"
  }
]

D图端点

最后要实施的终点是图形端点此端点以JSON格式输出有关图的数据,D JavaScript库由示例应用程序的UI使用

第一步是为我们需要的数据编写查询。关于GORM for Neo j的好处是它与Cypher查询语言具有强大的集成

要执行Cypher查询,只需定义一个方法称为findMovieTitlesAndCast使用暗号注解

grails应用程序服务新j电影MovieService groovy
暗号("""比赛${电影m}加入${人p}返回${m标题}电影收藏${p名}作为LIMIT$限制""")
  清单<地图<, 可迭代的<findMovieTitlesAndCast整型限制

使用暗号批注GORM可以自动实现为您执行Cypher查询的方法请注意,您如何在查询主体中使用类名和引用属性,并且将对它们进行类型检查以确保查询有效

下一步是将查询结果转换为D期望的格式

grails应用程序服务新j电影MovieService groovy
只读
地图<, 宾语图形整型限制100toD格式findMovieTitlesAndCast限制('NestedForLoop')
动态编译
私人的 静态的 地图<, 宾语toD格式清单<地图<, 可迭代的<结果清单<地图<,节点[]
    清单<地图<,宾语真实的[]
    整型一世0
    对于条目结果节点标题入门电影标签: '电影']
        整型目标我对于 (那么可迭代的<入门演员定义演员标题那么标签: '演员']
            整型源节点indexOf actor如果资源1我关心的节点actor来源资源资源目标目标节点节点链接真实的

图形方法采用Neo j结果并将其转换为适当的格式。最后,我们可以向电影控制器返回所需的数据

定义 图形响应movieService图参数int'限制', 100))
}

添加Neo j电影UI

难题的最后一部分是包括官方的Neo j示例应用程序UI,它是一个简单的HTML页面

索引html可以在页面中找到完整的src主webapp本教程的目录只需将其复制到您的应用程序中即可src主webapp目录

将下面的grails资源配置模式添加到grails应用配置会议应用yml文件

grails应用配置会议应用yml
ils:
    资源:
        图案: '/**'

修改grails应用程序控制器Neo J电影UrlMappings groovy将应用程序的根映射到此索引html文件

grails应用程序控制器Neo J电影UrlMappings groovy
'/'(小号: '索引html')

完成之后,您就可以运行该应用程序了

运行应用程序

在启动应用程序之前,请确保Neo j服务器正在运行,并且您已按照安装指南中的说明填充了Movies数据。入门部分

要运行该应用程序,请使用gradlew bootRun命令将在端口上启动应用程序

随着应用程序运行到HTTP本地主机并且您应该看到应用程序的用户界面通过图形的可视化正确呈现

新洋葱