【问题标题】:Gremlin: How can I merge groups of vertices when they are similarGremlin:当它们相似时如何合并顶点组
【发布时间】:2020-07-30 04:56:43
【问题描述】:

我的查询返回如下用户组顶点:

[
    [Pedro, Sabrina, Macka, Fer]
    [Pedro, Sabrina, Macka, Fer, Britney]
    [Brintey, Fred, Christina] 
]

前 2 组相似,包含大部分相同的顶点。我需要合并它们。 我需要合并相似的组,例如 80% 相似(80% 的元素相同)。

这在 gremlin 中可行吗?我该怎么做?

编辑: https://gremlify.com/2ykos4047g5

这个 gremlify 项目创建了一个类似于我在查询中的假输出,我需要将前 2 个列表合并到一个单独的列表中,因为它们包含几乎相同的顶点,而不是第三个,因为它与其他人。

所以我要问的是如何编写一个查询来比较所有列表,检查这些列表中有多少顶点是相同的,并据此决定是否将它们合并为一个。

gremlify 项目的预期输出是:

[
  [
    "Pedro",
    "Sabrina",
    "Macka",
    "Fer",
    "Britney"
  ],
  [
    "Garry",
    "Dana",
    "Lily"
  ]
]

【问题讨论】:

  • 我不确定这个问题在问什么。您能否提供代码来创建示例图以及预期输出是什么?
  • 我添加了更多解释和一个 gremlify 项目我希望现在更清楚

标签: gremlin tinkerpop tinkerpop3 gremlin-server


【解决方案1】:

Gremlin 没有根据列表的相似程度合并列表的步骤。 Gremlin 相当灵活,所以我想可能有办法以创造性的方式使用它的步骤来获得你想要的东西,但增加的复杂性可能不值得。我个人的偏好是使用 Gremlin 来检索我的数据,过滤掉无关的内容,然后将其转换为尽可能接近最终结果,同时保持可读性的平衡。

考虑到这种想法,如果您从 Gremlin 得到的结果只是一个字符串列表,并且到目前为止您的 Gremlin 结构良好且性能良好,那么也许 Gremlin 已经让您走得足够远,他的工作已经完成。获取该结果并在应用程序端对其进行后处理,方法是编写一些代码以获取最终结果。通过这种方法,您可以使用完整的编程语言环境以及所有可用的库,从而使最后一步更容易。

我还要补充一点,您的示例有点做作,并且侧重于任意结果,这会将您的 Gremlin 问题简化为集合操作问题。对于图表和 Gremlin,我经常发现将重点放在集合操作上以提高结果的质量(而不仅仅是结果的格式)意味着我应该回到我的遍历算法的核心,而不是尝试进行额外的操作在遍历结束时。

例如,如果您在此问题中询问的此输出与您之前的问题 herehere 相关,那么我想知道您是否不应该重新考虑算法的规则。也许,正如我在其中的一个答案中所说的那样,您真的不是“检测三角形然后尝试对它们进行相应的分组”。也许有一种完全不同的算法可以解决您的问题,而且更加有效和高效。

这篇博文“Reducing Computational Complexity with Correlate Traversals”很好地解释了这个一般概念。虽然它侧重于中心性算法,但总体信息非常明确:

所有中心性度量都有一个相似的概念主题——它们都根据它们相对于所有其他顶点的“中心”程度对图中的顶点进行评分。正是这种统一的概念可以导致不同的算法产生相同或相似的结果。图形系统架构师可以利用强的正相关性,使他们能够在可能的情况下选择计算复杂度较低的指标。

在您的情况下,您可能需要在为您的算法规定的规则中具有更大的灵活性,从而允许对您的结果进行更好(即不那么严格)的分组。无论如何,这是需要考虑的事情,在最坏的情况下,您显然可以采用您在问题中描述的蛮力方法并获得结果。

【讨论】:

  • 谢谢!我将尝试改进查询以生成更少的垃圾,这样我就不必迭代许多结果来清理它。很高兴知道 gremlin 结束的行和应用程序代码应该继续的行,通过阅读文档并不总是清楚这一行。
猜你喜欢
  • 2017-06-29
  • 1970-01-01
  • 2021-02-28
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 2020-08-15
相关资源
最近更新 更多