【问题标题】:Create new traversal object from a list of vertices从顶点列表创建新的遍历对象
【发布时间】:2019-08-09 09:29:02
【问题描述】:

我想过滤我的图以仅包含边数小于阈值(例如 50)的顶点,如下所示:

g.V().filter(bothE().limit(50).count().is(lt(50)))

这给了我想要保留的顶点列表。

如何创建仅包含这些顶点的traversal 对象?

背景

我需要计算图中每个顶点的 k-hop 邻域,以过滤掉具有大量边的顶点(例如

想到的第一种方法是首先过滤图,将结果存储为新的子图,然后遍历每个顶点以找到 k-hop 邻域。对于单个顶点v,k=5-hop 邻域码为:

g.V(v).repeat(__.bothE().bothV()).times(5).dedup().toList()

更好的方法可能是迭代原始未过滤图中的每个顶点并忽略连接到高边数顶点的边,但我不太确定如何执行此操作。

尝试 1:

filtered_edges = g.V().filter(bothE().limit(50).count().is_(lt(50))).outE().toList()
subgraph = g.E(filtered_edges).subgraph('subGraph').cap('subGraph').next()

不幸的是,在使用gremlinpython 时会引发错误 (StreamClosedError: Stream is closed)。在出现此错误之前和之后运行其他(可能成本更低)查询不会产生类似的错误,因此与 gremlin shell 的连接仍然存在。该代码也适用于 gremlin shell(将 is_ 替换为 is)。

我猜这是因为我在 gremlin 服务器和 Python 之间发送了太多数据,但不确定为什么会出现问题。

尝试 2:

使用 gremlin 客户端。我尝试用名称l 覆盖另一个遍历对象。但是覆盖操作失败 (l = subgraph.traversal();)。

gremlin_client = client.Client('ws://{}:{}/gremlin'.format('localhost', 8192), 'g', message_serializer=serializer.GraphSONSerializersV3d0())


command = "filtered_edges = g.V().filter(bothE().limit(50).count().is(lt(50))).outE().toList(); subgraph = g.E(filtered_edges).subgraph('subGraph').cap('subGraph').next(); l = subgraph.traversal();"
gremlin_client.submit(command).all().result()

【问题讨论】:

    标签: gremlin janusgraph gremlin-server


    【解决方案1】:

    您可以从那里继续遍历:

    s.V().filter(bothE().limit(50).count().is(lt(50))).out().has(...)....
    

    或:

    List<Vertex> list = s.V().filter(bothE().limit(50).count().is(lt(50))).toList()
    s.V(list).out().has(...)....
    

    【讨论】:

    • 谢谢斯蒂芬,唯一的问题是我希望多次使用过滤后的图表,所以不想每次运行查询时都重新计算s.V(list)。如何存储s.V(list) 以便重复使用?
    • 我不太确定您还有哪些其他选择。顶点列表与图形断开连接,因此再次遍历它们以在单独的遍历中收集与它们相关的任何内容意味着再次查找它们。如果您使用的是 Java,我想您可以使用 subgraph(),它会返回一个包含您关心的内容的 TinkerGraph,然后您可以查询该子图。
    • 嗨,斯蒂芬我已经尝试了几种方法来解决这个问题(请参阅更新),但我运气不佳。如果您能提供一些关于我哪里出错的见解,我将不胜感激
    • 请注意,我说“如果您使用的是 Java”,那么subgraph() 是一个选项。 gremlinpython 尚不支持该特定步骤(python 中没有 TinkerGraph 可用于子图)。在“尝试 2”中使用脚本应该有效,但前提是您使用会话并将 TinkerGraph 保留在服务器上(即设置为变量并且不返回任何内容,然后在下一个请求时访问它)。另外,为什么要使用g.E() 重新查询所有边,您是否需要子图中的所有边(您想要的顶点只是那些边少于 50 条的顶点,但您需要哪些特定的边)?
    • 话虽如此,会话并不是一个很好的解决方案。我仍然不确定我是否理解您在这里尝试解决的问题,因为您尝试做的事情的整个范围并没有真正得到解释。您尝试在最初找到的少数顶点上执行多少额外的查询?它们是突变还是只是额外的读取来获取数据?如果它们只是额外的读取,那么这些读取的性质是什么(例如,对整个图的深度遍历?进一步按属性过滤这些顶点?)。我不知道...也许您需要形成一个包含更多细节的新问题。
    猜你喜欢
    • 2018-04-12
    • 2018-07-30
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2016-11-22
    • 1970-01-01
    相关资源
    最近更新 更多