【问题标题】:Search for the most recently added node搜索最近添加的节点
【发布时间】:2018-08-22 13:24:12
【问题描述】:

我正在向图中添加具有特定标签的顶点(目前使用 gremlin-python 而不是 gremlinv3.3)。我正在手动向这些节点添加“时间戳”属性。我希望能够找到最近添加的带有此标签的顶点,以便我可以从那里向后检索一定数量的顶点。在每次添加时添加一组从第二新到最新顶点的“下一个”类型边,这将允许我在找到最新顶点后执行向后搜索。
我希望能够在亚线性时间(理想情况下为 O(1) 时间)中找到最近添加的顶点。以下是一些如何做到这一点的想法:

  • 我可以手动维护一个“最新”类型的节点,它指向 这种类型的最新顶点,然后搜索它。
  • 我可以在添加这些顶点时在这些顶点上创建一个索引顶点的二叉树,以便向上搜索树并从任何位置向下搜索 这些顶点中的一个将我带到 O(log(n)) 时间内的最新节点。
  • 也可能是我可以利用时间戳属性进行有效搜索,但我不清楚如何。

问题是,我不太了解图形搜索是如何在后台实现的,不知道这些策略中的哪一个是最好的。任何人都可以帮忙吗? 我创建的东西也很可能会被重新部署到 amazon-neptune 实例中,而且我也不清楚这是否会改变最佳策略。

【问题讨论】:

    标签: gremlin tinkerpop amazon-neptune


    【解决方案1】:

    我可以手动维护一个“最新”类型的节点,它指向 这种类型的最新顶点,然后搜索它。

    这是最简单、最快的解决方案。基于其他搜索查询的解决方案需要某种索引结构,不允许您访问 O(1) 中的最新顶点。

    【讨论】:

    • 谢谢,但毕竟,我不确定这是正确的解决方案。我发现了 profile() 步骤,它允许我测试执行时间。 g.g.addV('test').next() for x in range(10000): g.g.addV('other').next() if x % 100 == 0: print(g.g.V().hasLabel('test').profile().next()['@value']['dur']) 此测试显示查询的持续时间随着内容(顶点数)的增加而增加。但是,如果我知道要查找的顶点的 id,则查询会在 O(1) 时间内执行。这表明我应该将最新节点的 id 保留在图表之外(?)
    • 这被认为是一种反模式。也许只是在虚拟属性上索引测试顶点。
    • 啊!我没有意识到你可以创建索引——这改变了游戏规则。事实上,文档的这一部分表明我不能,至少对于 Tinkerpop3:tinkerpop.apache.org/docs/3.3.3/reference/#_indices,但是这部分表明我应该能够:tinkerpop.apache.org/docs/3.3.3/reference/#security ... 将 gremlin-python 附加到 Tinkerpop3,我似乎无法访问 createIndex 或 createKeyIndex 方法 - 有什么建议吗?
    • 我刚刚被提醒 Neptune 会自动为所有内容编制索引。因此,像g.V().has('test', 'foo', 'bar') 这样的查询应该总是表现良好。
    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 2021-11-19
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多