View a markdown version of this page

使用 Gremlin 访问 Amazon Neptune 中的图形数据 - Amazon Neptune

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Gremlin 访问 Amazon Neptune 中的图形数据

你可以使用 Gremlin 控制台在 REPL(读取评估-打印循环)环境中试验 TinkerPop 图表和查询。

以下教程将引导您使用 Gremlin 控制台向海王星图添加顶点、边、属性等,重点介绍了 Gremlin 实现中的一些差异。 Neptune-specific

注意

此示例假定您已完成以下内容:

使用 Gremlin 控制台
  1. 将目录更改为解压缩 Gremlin 控制台文件所在的文件夹。

    cd apache-tinkerpop-gremlin-console-3.7.2
  2. 输入以下命令以运行 Gremlin 控制台。

    bin/gremlin.sh

    您应看到以下输出:

    \,,,/ (o o) -----oOOo-(3)-oOOo----- plugin activated: tinkerpop.server plugin activated: tinkerpop.utilities plugin activated: tinkerpop.tinkergraph gremlin>

    您现在位于 gremlin> 提示符处。您在此提示符处输入剩余步骤。

  3. 在 gremlin> 提示符处,输入以下命令以连接到 Neptune 数据库实例。

    :remote connect tinkerpop.server conf/neptune-remote.yaml
  4. 在 gremlin> 提示符处,输入以下命令以切换到远程模式。这会将所有 Gremlin 查询发送到远程连接。

    :remote console
  5. 添加带有标签和属性的顶点。

    g.addV('person').property('name', 'justin')

    顶点分配有包含 GUID 的 string ID。Neptune 中的所有顶点 ID 均为字符串。

  6. 添加具有自定义 ID 的顶点。

    g.addV('person').property(id, '1').property('name', 'martin')

    id 属性未使用引号引起来。这是顶点 ID 的关键字。顶点 ID 具有一个字符串,其中包含数字 1。

    普通属性名称必须包含在引号中。

  7. 更改属性或添加属性(如果属性不存在)。

    g.V('1').property(single, 'name', 'marko')

    此处介绍如何更改上一步中顶点的 name 属性。这会从 name 属性删除现有值。

    如果您未指定 single,则会改为将值附加到 name 属性(如果尚未附加)。

  8. 添加属性,但在属性已有值时附加属性。

    g.V('1').property('age', 29)

    Neptune 使用集基数作为默认操作。

    此命令添加值为 29 的 age 属性,但不替换任何现有值。

    如果 age 属性已有值,此命令将 29 附加到属性。例如,如果 age 属性是 27,则新值将为 [ 27, 29 ]。

  9. 添加多个顶点。

    g.addV('person').property(id, '2').property('name', 'vadas').property('age', 27).iterate() g.addV('software').property(id, '3').property('name', 'lop').property('lang', 'java').iterate() g.addV('person').property(id, '4').property('name', 'josh').property('age', 32).iterate() g.addV('software').property(id, '5').property('name', 'ripple').property('lang', 'java').iterate() g.addV('person').property(id, '6').property('name', 'peter').property('age', 35)

    您可以同时将多个语句添加到 Neptune。

    语句可以使用换行符 ('\n')、空格 (' ')、分号 ('; ') 或什么都不使用(例如,g.addV(‘person’).iterate()g.V() 是有效的)来分隔。

    注意

    Gremlin 控制台对每个换行符 ('\n') 发送单独的命令,因此在该例中,它们每一个都是一项单独的事务。此示例的每个命令位于单独一行中,以便阅读。删除换行符 ('\n') 可以将其通过 Gremlin 控制台作为单个命令发送。

    除了最后一条语句之外的所有语句必须以终止步骤结尾,例如 .next() 或 .iterate(),否则语句不会运行。Gremlin 控制台不需要这些终止步骤。在不需要对结果进行序列化时使用 .iterate。

    一起发送的所有语句包括在单个事务处理中,并且一起成功或失败。

  10. 添加边缘。

    g.V('1').addE('knows').to(__.V('2')).property('weight', 0.5).iterate() g.addE('knows').from(__.V('1')).to(__.V('4')).property('weight', 1.0)

    这里介绍了两种不同的方法来添加边缘。

  11. 添加现代图形的其余部分。

    g.V('1').addE('created').to(__.V('3')).property('weight', 0.4).iterate() g.V('4').addE('created').to(__.V('5')).property('weight', 1.0).iterate() g.V('4').addE('knows').to(__.V('3')).property('weight', 0.4).iterate() g.V('6').addE('created').to(__.V('3')).property('weight', 0.2)
  12. 删除顶点。

    g.V().has('name', 'justin').drop()

    删除 name 属性等于 justin 的顶点。

    重要

    停在这里,你就有了完整的 Apache TinkerPop 现代版图表。本 TinkerPop 文档的 “遍历” 部分中的示例使用现代图。

  13. 运行遍历。

    g.V().hasLabel('person')

    返回所有 person 顶点。

  14. 使用值运行遍历 (valueMap())。

    g.V().has('name', 'marko').out('knows').valueMap()

    返回 marko“知道”的所有顶点的键值对。

  15. 指定多个标签。

    g.addV("Label1::Label2::Label3")

    Neptune 对于一个顶点支持多个标签。创建标签时,您可以指定多个标签,同时使用 :: 分隔它们。

    此示例添加具有三个不同标签的顶点。

    hasLabel 步骤与具有以下任一三个标签的此顶点相匹配:hasLabel("Label1")、hasLabel("Label2") 和 hasLabel("Label3")。

    :: 分隔符仅用于此用途。

    您不能在 hasLabel 步骤中指定多个标签。例如,hasLabel("Label1::Label2") 与任何内容都不匹配。

  16. 请指定 Time/date。

    g.V().property(single, 'lastUpdate', datetime('2018-01-01T00:00:00'))

    Neptune 不支持 Java 日期。改用该datetime()函数。datetime()接受一个 ISO8061-compliant datetime字符串。

    支持以下格式:YYYY-MM-DD, YYYY-MM-DDTHH:mm、YYYY-MM-DDTHH:mm:SS 和 YYYY-MM-DDTHH:mm:SSZ。

  17. 删除顶点、属性或边缘。

    g.V().hasLabel('person').properties('age').drop().iterate() g.V('1').drop().iterate() g.V().outE().hasLabel('created').drop()

    下面是几个删除示例。

    注意

    .next() 步骤不可与 .drop() 一起使用。请改用 .iterate()。

  18. 完成后,输入以下命令以退出 Gremlin 控制台。

    :exit
注意

使用分号 (;) 或换行符 (\n) 分隔每个语句。

在最后遍历之前的每个遍历必须以要执行的 iterate() 结尾。仅返回最后遍历中的数据。