【问题标题】:How to traverse without indexed value?没有索引值如何遍历?
【发布时间】:2020-02-25 07:11:26
【问题描述】:

我有一个场景,我想查询所有没有特定属性键和值的顶点。所以,我尝试的是

g.V().hasLabel('Persona').hasNot('isTempDob').count()

导致

Could not find a suitable index to answer graph query and graph scans are disabled: [(~label = Persona)]:VERTEX

所以我尝试了更简单的方法,方法是按照文档获取标签名称为 Persona 的顶点数。查询是

g.V('Persona').count()

导致

0

不知道为什么没有任何索引值就无法遍历?任何帮助将不胜感激。在此先感谢。

【问题讨论】:

    标签: node.js gremlin janusgraph


    【解决方案1】:

    也许它只是一个错误类型,但g.V('Persona').count() 不搜索标签 - 它查找具有唯一标识符“Persona”的顶点。结果我怀疑“0”的答案是正确的。

    不知道为什么没有任何索引值就无法遍历?

    JanusGraph(和其他图形系统)防止没有索引值的遍历作为护栏,以防止用户意外执行长时间运行的查询。如果您有一个只有数千个顶点的小图,那么您可能会发现此功能很烦人,但是当您有数十亿个顶点时,它可能是一个很好的帮手,因为您在那里编写的查询将花费数小时和数小时完成并且不会是获得该答案的推荐方法。如果您正在对图中的所有顶点进行全局扫描,那么您应该在 Spark 上执行 Gremlin,以享受它的并行处理能力,将这些小时和数小时变成几分钟。

    回到小图的情况,你可以通过使用query.force-index=false 配置JanusGraph 来暂时禁用护栏以允许查询执行。这应该允许您的查询在没有该错误/警告的情况下工作。

    【讨论】:

    • 感谢您提供的信息。但我还有一个疑问。在此查询 g.V('Persona').count() 中,如果 Persona 不是标签,那么唯一标识符的含义是什么。这个唯一标识符是否意味着该顶点中的唯一属性。
    • 就我而言,是的,我有大量的顶点。但是我的一些带有标签角色的顶点具有像 id、dob (索引)这样的属性,而其他一些只有 id。 Id 是唯一的 UUID 并且也被索引。我已经遍历了那些有 dob 添加新属性值的顶点。但是要将该新属性添加到没有 dob 属性的其他顶点,我无法在没有索引值的情况下进行遍历。
    • 每个图元素(顶点/边)都有一个唯一标识符(有些图允许您自己分配它,其他人生成一个)。该 id 使您可以最快地找到该元素。请注意,g.V(1) 与 g.V().hasId(1)` 相同,如果这样更容易理解的话。
    • 我会避免使用名称为“id”的属性键,因为它重载了 T.id 的概念,这是我所指的唯一元素标识符,因此会使事情变得混乱。也许更喜欢“personId”或类似的东西来表示您的应用程序级别的唯一标识符。听起来好像您只是在图表中进行一些管理数据修改,在这种情况下暂时禁用 query.force-index 听起来应该可以解决您的问题。我想这取决于您的图表有多大以及您愿意等待多长时间。
    【解决方案2】:

    我在gremlin console docker测试过。

    标识符是每个顶点的唯一 ID。创建顶点时,您可以指定一个 ID 或自动生成一个。例如,

    gremlin> saturn = g.addV("character").property(T.id, 1).property('name', 'saturn').property('age', 10000).property('type', 'titan').next();
    ==>v[1]
    

    如果您以上述方式创建顶点,您将获得 v[1] 作为 ID,因为您指定了它。 以下未指定 ID,则 gremlin 会为您生成一个:

    gremlin> g.addV("character").property('name',  'prometheus').property('age', 1000).property('type', 'god').next()
    ==>v[0]
    

    假设它是第一个顶点,那么它的 ID 将为 0。 在您的场景中,如果您要查询的所有顶点都具有相同的标签并排除指定的名称,您可以试试这个(我使用的是 JanusGraph 玩具图gods):

    gremlin> g.V().has('character','name',neq('hercules')).valueMap();
    ==>[name:[prometheus],type:[god],age:[1000]]
    ==>[name:[saturn],type:[titan],age:[10000]]
    ==>[name:[jupiter],type:[god],age:[5000]]
    ==>[name:[neptune],type:[god],age:[4500]]
    ==>[name:[alcmene],type:[human],age:[45]]
    ==>[name:[pluto],type:[god],age:[4000]]
    ==>[name:[nemean],type:[monster],age:[20]]
    ==>[name:[hydra],type:[monster],age:[0]]
    ==>[name:[cerberus],type:[monster],age:[0]]
    

    上述查询查找所有标记为 character 的顶点并排除名称 hercules。或者您可以使用以下查询来做同样的事情。

    gremlin> g.V().hasLabel('character').has('name',neq('hercules')).valueMap();
    

    您的查询不起作用的原因是hasNot(key) 必须与键而不是值一起使用。

    如果有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-10
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多