本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Gremlin 访问 Amazon Neptune 中的图表数据
你可以使用 Gremlin 控制台在REPL(read-eval-print 循环)环境中尝试 TinkerPop 图形和查询。
以下教程为您演练使用 Gremlin 控制台将顶点、边缘、属性以及更多内容添加到 Neptune 图形的过程,重点讲述 Neptune 特定的 Gremlin 实施的不同之处。
注意
此示例假定您已完成以下内容:
您已使用连接SSH到 Amazon EC2 实例。
您已创建了一个 Neptune 集群,如创建 Neptune 集群中所述。
您已安装了 Gremlin 控制台,如 安装 Gremlin 控制台 中所述。
使用 Gremlin 控制台
-
将目录更改为解压缩 Gremlin 控制台文件所在的文件夹。
cd apache-tinkerpop-gremlin-console-3.7.2
-
输入以下命令以运行 Gremlin 控制台。
bin/gremlin.sh
您应看到以下输出:
\,,,/ (o o) -----oOOo-(3)-oOOo----- plugin activated: tinkerpop.server plugin activated: tinkerpop.utilities plugin activated: tinkerpop.tinkergraph gremlin>
您现在位于
gremlin>
提示符处。您在此提示符处输入剩余步骤。 -
在
gremlin>
提示符处,输入以下命令以连接到 Neptune 数据库实例。:remote connect tinkerpop.server conf/neptune-remote.yaml
-
在
gremlin>
提示符处,输入以下命令以切换到远程模式。这会将所有 Gremlin 查询发送到远程连接。:remote console
-
添加带有标签和属性的顶点。
g.addV('person').property('name', 'justin')
为顶点分配一个GUID包含
string
ID。在 Neptune 中,所有顶点IDs都是字符串。 -
添加具有自定义 ID 的顶点。
g.addV('person').property(id, '1').property('name', 'martin')
id
属性未使用引号引起来。这是顶点 ID 的关键字。顶点 ID 具有一个字符串,其中包含数字1
。普通属性名称必须包含在引号中。
-
更改属性或添加属性(如果属性不存在)。
g.V('1').property(single, 'name', 'marko')
此处介绍如何更改上一步中顶点的
name
属性。这会从name
属性删除现有值。如果您未指定
single
,则会改为将值附加到name
属性(如果尚未附加)。 -
添加属性,但在属性已有值时附加属性。
g.V('1').property('age', 29)
Neptune 使用集基数作为默认操作。
此命令添加值为
29
的age
属性,但不替换任何现有值。如果
age
属性已有值,此命令将29
附加到属性。例如,如果age
属性是27
,则新值将为[ 27, 29 ]
。 -
添加多个顶点。
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
。一起发送的所有语句包括在单个事务处理中,并且一起成功或失败。
-
添加边缘。
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)
这里介绍了两种不同的方法来添加边缘。
-
添加现代图形的其余部分。
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)
-
删除顶点。
g.V().has('name', 'justin').drop()
删除
name
属性等于justin
的顶点。重要
到此为止,你就有了完整的 Apache M TinkerPop odern 图表。 TinkerPop 文档遍历部分
中的示例使用现代图。 -
运行遍历。
g.V().hasLabel('person')
返回所有
person
顶点。 -
使用值 (valueMap()) 运行遍历。
g.V().has('name', 'marko').out('knows').valueMap()
返回
marko
“知道”的所有顶点的键值对。 -
指定多个标签。
g.addV("Label1::Label2::Label3")
Neptune 对于一个顶点支持多个标签。创建标签时,您可以指定多个标签,同时使用
::
分隔它们。此示例添加具有三个不同标签的顶点。
hasLabel
步骤与具有以下任一三个标签的此顶点相匹配:hasLabel("Label1")
、hasLabel("Label2")
和hasLabel("Label3")
。::
分隔符仅用于此用途。您不能在
hasLabel
步骤中指定多个标签。例如,hasLabel("Label1::Label2")
与任何内容都不匹配。 -
指定时间/日期。
g.V().property(single, 'lastUpdate', datetime('2018-01-01T00:00:00'))
Neptune 不支持 Java 日期。改用该
datetime()
函数。datetime()
接受ISO8符合 061datetime
的字符串。支持以下格式:
YYYY-MM-DD, YYYY-MM-DDTHH:mm
、YYYY-MM-DDTHH:mm:SS
和YYYY-MM-DDTHH:mm:SSZ
。 -
删除顶点、属性或边缘。
g.V().hasLabel('person').properties('age').drop().iterate() g.V('1').drop().iterate() g.V().outE().hasLabel('created').drop()
下面是几个删除示例。
注意
.next()
步骤不可与.drop()
一起使用。请改用.iterate()
。 -
完成后,输入以下命令以退出 Gremlin 控制台。
:exit
注意
使用分号 (;
) 或换行符 (\n
) 分隔每个语句。
在最后遍历之前的每个遍历必须以要执行的 iterate()
结尾。仅返回最后遍历中的数据。