使用 Gremlin 访问图形 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

使用 Gremlin 访问图形

您可以使用 Gremlin 控制台在 REPL(读取-求值-输出循环)环境中试验 TinkerPop 图形和查询。

以下教程为您演练使用 Grymlin 控制台将顶点、边缘、属性以及更多内容添加到 Neptune 图形的过程,重点讲述特定 Gemlin 实施的不同之处。

注意

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

使用 Gremlin 控制台

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

    cd apache-tinkerpop-gremlin-console-3.4.8
  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 使用集基数作为默认操作。

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

    如果 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(g.V('2')).property('weight', 0.5).iterate() g.addE('knows').from(g.V('1')).to(g.V('4')).property('weight', 1.0)

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

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

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

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

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

    重要

    到这里,您拥有了完整的 Apache TinkerPop 现代图形。The examples in the 遍历部分的 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. 指定时间/日期

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

    Neptune 不支持 Java 日期。改用 datetime() 函数。datetime() 接受符合 ISO8061 的 datetime 字符串。

    支持以下格式:YYYY-MM-DD, YYYY-MM-DDTHH:mmYYYY-MM-DDTHH:mm:SSYYYY-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() 结尾。仅返回最后遍历中的数据。