【问题标题】:Define Graph Schema in AWS Neptune to prevent data duplication在 AWS Neptune 中定义 Graph Schema 以防止数据重复
【发布时间】:2018-08-01 15:41:20
【问题描述】:

当使用 TinkerPop/JanusGraph 时,我可以定义 VertexLabels 和 Property Keys,我可以使用它们来创建复合索引。我在海王星文档的某处读到索引不是必需的(或支持的)。

我的问题是如何在将数据加载到数据库时防止重复?我在 AWS 文档中找到的唯一示例涉及加载数据,其中已经为每条记录提供了唯一 ID,对我来说,这似乎需要首先从 RDBMS 中提取数据,以便在我之前拥有所有 ID 及其关系可以加载它。

我是否理解正确,如果不是,我该如何解决?

【问题讨论】:

    标签: tinkerpop3 amazon-neptune


    【解决方案1】:

    是的,您的理解是正确的。顶点和边的唯一性约束适用于它们的 ~id 属性,即 ID 是唯一的。

    有两种方法可以将数据插入 Neptune。您可以使用加载器接口(推荐)或通过 Gremlin 插入。

    案例#1:通过批量加载程序插入(推荐)

    通过加载器插入目前仅支持 CSV 格式,正如您所观察到的,它确实需要用户为顶点和边定义 ID。

    案例#2:通过 Gremlin 插入

    对于通过 Gremlin 插入,提供 ID 是可选的。如果您不提供 ID,则 Neptune 会自动为顶点或边分配一个唯一 ID。 例如g.addV() 添加一个顶点并为其分配一个唯一标识符。

    进一步关于案例#2,您可以在同一个查询中添加两个顶点和关系。这不需要知道数据库自动分配给顶点的 ID。

    g.addV().as("node1").property("name","Simba").addV().as("node2").property("name","Mufasa").addE("knows").from("node1").to("node2")

    或者,使用唯一的属性标识符从数据库中查询节点: g.addV().property("name","Simba"); g.addV().property("name","Mufasa"); g.V().has("name","Simba").as("node1").V().has("name","Mufasa").as("node2").addE("knows").from("node1").to("node2");

    【讨论】:

    • 在您的案例#2 中,您如何控制不同记录中节点之间的关系?假设我读取了一条记录 #1,它创建了一个节点,数据库自动为其分配了“ID1”。那么记录#31,有对记录#1的引用,如何获取'ID1'来创建边呢?您是否在每个 g.addV() 之前查询数据库以查找现有节点并获取其 ID?
    • 用您的问题的答案更新了答案。评论有字符数限制。
    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多