我开始研究DynamoDB,但无法阅读有关物化图模式(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html)的内容。
我想我有一些想法,但是还不了解整个事情。 据我了解的模式,主表存储边,每个边可以具有属性(数据属性)。
例如(摘自下表): 节点1(PK 1)的节点2的边缘为DATE类型,而边缘为BIRTH(SK DATE | 2 | BIRTH)类型。
我想这与Cipher中的()-[:BIRTH]->(:DATE {id:2})有点相同,对吧?
但是在此之后,还不清楚一切如何融合在一起。 例如:
有人可以通过一些用例向我解释一切如何融合吗?
谢谢。
答案 0 :(得分:1)
希望这能回答您的所有问题。这里有一些介绍性的东西。我将在所有示例中使用通用表。哈希键为node_a
,排序键为node_b
。有一个反向查询GSI,其中node_b
是哈希键,node_a
是排序键。
1。数据属性可以是地图吗?
数据属性可以是supported data types in DynamoDB中的任何一个,包括地图。
2。数据属性是否必须在写入时写入两个位置?
数据属性只能写入一个位置。对于生日的示例,您可以执行以下DynamoDB条目之一:
node_a | node_b | data
----------|-----------|---------------
user-1 | user-1 | {"birthdate":"2000-01-01", "firstname": "Bob", ...}
user-1 | birthdate | 2000-01-01
在第一行中,我们从user-1
节点创建了一条边,该边自行循环。在第二行中,我们创建了一条从user-1
到birthdate
的边。两种方法都可以,最好的选择取决于您将如何访问数据。如果需要能够找到生日在给定范围内的用户,则应创建一个birthdate
节点。如果只需要从用户ID查找用户的信息,则可以使用任何一种策略,但是第一行通常可以更有效地利用表的吞吐量。
3。如果要添加1980年12月19日出生的新人,是否必须先查找相应的节点?
不。只需插入上面示例中的行之一即可。
如果存在更复杂的访问模式,例如“更新1980年12月19日出生的人的名字”,则只需查找该节点。在这种情况下,您需要按生日进行查找以获取人员节点,然后修改与人员节点相关的内容。但是,该用例实际上是两个不同的操作。您可以将该句子改写为“查找1980年12月19日出生的人,并更新名字”,这使这两项操作更加明显。
4.(a)如何获取与节点关联的所有属性?
假设您要查找“ myNode”的所有边缘。您将使用node_a="myNode"
的{{3}}查询主表,并使用关键条件表达式node_b="myNode"
查询反向查找GSI。这相当于SELECT * FROM my_table WHERE node_a="myNode" OR node_b="myNode"
。
4.(b)如何获取与边关联的所有属性?
边缘的所有属性都直接存储在边缘的属性中,但是您仍然可能会遇到无法确切知道数据在哪里的情况。例如:
node_a | node_b | data
----------|-----------|---------------
thing-1 | thing-2 | Is the data here?
thing-2 | thing-1 | Or here?
如果您知道边缘节点的顺序(即哪个节点是node_a
和node_b
),则只需执行一次key condition expression操作即可检索数据。如果您不知道节点的顺序,则可以使用GetItem
查找表中的两行(除非您要进行涉及有向图)。
5。如何查询相邻节点?
相邻节点只是两个具有连接它们的边缘的节点。您将使用与4a相同的查询,除了您对其他节点的ID感兴趣之外,而不是对data
属性感兴趣。
更多示例
BatchGetItems