【问题标题】:what is the best way to retrive information in a graph through has Step通过 has Step 在图表中检索信息的最佳方法是什么
【发布时间】:2016-12-07 10:46:12
【问题描述】:

我正在使用带有 tinkerpop 插件的 Titan graph db。使用 has step 检索顶点的最佳方法是什么?

假设employeeId 是一个独特的属性,它定义了一个独特的以顶点为中心的索引。

是不是通过标签 即 g.V().has(label,'employee').has('employeeId','emp123') g.V().has('employee','employeeId','emp123')

(或) 直接根据唯一属性检索顶点会更好吗? 即 g.V().has('employeeId','emp123')

这两种方法中哪一种是最快和更好的方法?

【问题讨论】:

    标签: titan gremlin tinkerpop


    【解决方案1】:

    第二个选项g.V().has('employeeId','emp123') 更好,只要属性employeeId 一直是indexed 以获得更好的性能。

    这是因为 gremlin 遍历中的每一步都是一个过滤器。所以当你说:

    g.V().has(label,'employee').has('employeeId','emp123')
    

    您首先转到带有标签employee 的所有顶点,然后从您找到emp123 的员工顶点。

    使用g.V().has('employeeId','emp123'),复合索引允许您直接转到正确的顶点。

    编辑:

    正如丹尼尔在他的回答中指出的那样,Titan 实际上足够聪明,不会访问所有员工并立即利用索引。所以在这种情况下,遍历之间似乎没有什么区别。我个人喜欢使用不带标签的直接全局索引(即第一次遍历),但这只是使用 Titan 时的偏好,我喜欢将步骤和过滤器保持在最低限度。

    【讨论】:

    • 直到最近我都同意 Filipe,这也是我的思考过程。但是在浏览了academy.datastax.com/courses/ds330-datastax-enterprise-graph 的 DSE 图形视频教程之后,我现在怀疑,因为那里的索引恰好是完全以顶点为中心的,并且视频中的示例也提倡第一种语法 g.V().hasLabel('employee').has('employeeId','emp123')。现在我不确定上面的推理是否正确!我知道 DSE 图形和 Titan 中的索引完全不同,但要加倍确定方法 2 是正确的!!
    • @Phani 我相信我建议的第一次遍历更好,但这是 Titan 独有的。我没有经常使用 DSE,所以我不确定他们是如何进行索引的,它很可能是以顶点为中心的。谢谢你的链接,我稍后会检查它。
    【解决方案2】:

    首先,您有 2 个选项来创建索引:

    1. mgmt.buildIndex('byEmployeeId', Vertex.class).addKey(employeeId).buildCompositeIndex()
    2. mgmt.buildIndex('byEmployeeId', Vertex.class).addKey(employeeId).indexOnly(employee).buildCompositeIndex()

    对于选项 1,您将使用哪个查询并不重要。对于选项 2,必须使用 g.V().has('employee','employeeId','emp123')

    请注意,g.V().hasLabel('employee').has('employeeId','emp123')不会首先选择所有员工。 Titan 足够聪明,可以首先应用那些可以利用索引的过滤条件。

    我还要指出一点:indexOnly() 的全部意义在于允许在不同类型的顶点之间共享属性。因此,您可以将其称为uuid,而不是将其称为employeeId,并将其用于雇主、公司等:

    mgmt.buildIndex('employeeById', Vertex.class).addKey(uuid).indexOnly(employee).buildCompositeIndex()
    mgmt.buildIndex('employerById', Vertex.class).addKey(uuid).indexOnly(employer).buildCompositeIndex()
    mgmt.buildIndex('companyById', Vertex.class).addKey(uuid).indexOnly(company).buildCompositeIndex()
    

    您的查询将始终具有以下模式:g.V().has('<label>','<prop-key>','<prop-value>')。这实际上是 DSE Graph 的唯一方法,因为我们完全摆脱了跨越所有类型顶点的全局索引。起初我真的不喜欢这个决定,但同时我不得不承认这更干净。

    【讨论】:

    • 非常感谢丹尼尔,这么好的解释。它为我扫清了乌云。现在我们可以用一种尽可能同时适应 Titan 和 DSE 语法的方式编写我们的 gremlin 查询,以便迁移到 DSE(如果不可避免的话)我们可以用最少的麻烦来完成 :)
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2011-06-29
    • 1970-01-01
    • 2021-02-02
    • 2021-05-22
    • 2015-04-08
    相关资源
    最近更新 更多