【问题标题】:How to reduce the number of same edge label between two Vertex in Titan如何减少Titan中两个顶点之间相同边缘标签的数量
【发布时间】:2017-01-08 20:42:46
【问题描述】:

假设我们有两种 Vertex:LOGIN_USER(property:user_id) 和 IP(property:ip),它们之间的 EDGE 是:LOGIN(property:session_id, login_time)。

这个模型的问题是一个用户和 IP 之间有两条多条边(可以是数千条)。 有没有办法减少两个顶点的边数,同时可以保留属性:sessionId和login_time?我们想为某些查询过滤这两个属性。 边属性不支持基数:列出哪些顶点属性支持。

如果将所有边缘属性放入 Vertex,是否会影响获取 Vertex 的性能? 当泰坦加载顶点的属性时?当遍历一个 Vertex 时,让我们 g.V(1).next(),Titan 会加载该 Vertex 的所有 Property 吗?

【问题讨论】:

    标签: graph titan gremlin


    【解决方案1】:

    当您说 USER 和 IP 之间有“数千”条边时,您认为它实际上可能是“数百万”或“数千万”或更多吗?如果不是,那么对于 vertex centric indices 的 Titan 来说,“数千”应该不是问题。索引你的边缘属性,你应该有快速的排序和遍历。

    当您开始深入“数百万”时,您可能会开始遇到一些问题 - 对我来说,一直使用 Titan-hadoop 处理全局查询,因为顶点及其边缘必须保存在内存中。当您进行全球分析时,这可能会造成一些麻烦。从操作的角度来看,Titan 总是乐于将边缘写入顶点上的数百万个,但我倾向于避免它。当然,我在这方面的大部分经验都出现在 Titan 1.0 中的 vertex cutting 之前:

    切割一个顶点意味着存储该顶点邻接的子集 在图中的每个分区上列出。换句话说,顶点和 它的邻接表是分区的,从而有效地分布 在集群中的所有实例上加载该单个顶点 并移除热点。

    当您开始将超级节点增加到数百万时,您可能会尝试使用它。

    我想在数百万条边中的超级节点的另一种选择是围绕它进行建模。也许您在 USER 和 IP 之间引入了一些结构。将单个 LOGIN 边转换为一些可能在它们之间引入时间概念的顶点/边,例如:

    用户 -> LOGIN_YEAR -> LOGIN_MONTH -> IP

    所以现在,不是在 USER 和 IP 之间创建一条边,而是创建一个 LOGIN_YEAR 顶点和一个 LOGIN_MONTH 顶点。

    【讨论】:

    • 谢谢。我们现在正在测试 DynamoDB。你现在用的是哪个存储??目前我们发现两个顶点之间的边太多,速度很慢。另外,当我们运行 gV('userId').out('LOGIN').in().values() 时,会看到很多重复的顶点,Titan 返回所有边的 inVertex,尽管大部分边都路由到同一个顶点。
    • 我的经验是使用 cassandra。我认为您的顶点重复是预期的遍历。您从 USER 遍历了out,但随后又遍历了in,并且您从中遍历的原始顶点位于该路径中。您必须过滤掉那些返回起始顶点的路径。我怀疑您还想删除重复项。所以你的遍历看起来像:g.V('userId').as('x').out('LOGIN').in().where(neq('x')).dedup().values()
    • 您的数据量是多少?亿级? g.V('userId').as('x').out('LOGIN').in().where(neq('x')).dedu‌​p().values() 的查询延迟如何?
    • 是的 - 图中总共有数十亿条边,但在单个顶点上从未超过数百万条。我不知道您会看到我的遍历和您的遍历之间的速度差异很大 - 我只是想过滤掉您的一些重复项。如果您想在遇到具有大量边的顶点时加快遍历速度,则需要通过创建一些以顶点为中心的索引并在遍历中使用它们来更好地过滤边。这样一来,Titan 应该将过滤器下推到数据库并返回更少的数据。
    • 感谢斯蒂芬的建议。我现在正在使用 Cassandra。我为边缘设置了 Vertex Partition 和 Vertex-Centrics 索引。但是我的查询很慢,我不确定它是否常见。 g.V('userId').as('x').out('LOGIN').in().where(neq('x')).dedu‌​p().values() 将花费数百秒。 Titan可以并行查询吗?我还测试了 limit() 以尝试限制结果,但它仍然很慢。 Titan是先得到结果,然后再做'limit'吗?如何知道泰坦的执行计划?
    猜你喜欢
    • 2013-11-03
    • 2020-06-19
    • 1970-01-01
    • 2017-10-24
    • 2016-04-07
    • 2012-10-09
    • 2023-03-09
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多