从顶点列表创建新的遍历对象

时间:2019-08-09 09:29:02

标签: gremlin janusgraph gremlin-server

我想过滤我的图,使其仅包括边缘数量少于阈值(例如50)的顶点,如下所示:

<ul class="navbar-nav ml-auto">
            <li>
                <a class="nav-link" href="#showcase" 
                   data-toggle="collapse" data-target=".navbar-collapse.show">Home</a>
            </li>
            <li>
                <a class="nav-link" href="#features" data-toggle="collapse"
                    data-target=".navbar-collapse.show">Feature</a>
            </li>
            <li>
                <a class="nav-link" href="#teams" data-toggle="collapse" data-target=".navbar-collapse.show">Team</a>
            </li>
            <li>
                <a class="nav-link" href="#contact" data-toggle="collapse"
                    data-target=".navbar-collapse.show">Contact</a>
            </li>
    </ul>

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

如何创建仅包含这些顶点的g.V().filter(bothE().limit(50).count().is(lt(50))) 对象?

背景

我需要计算图形中每个顶点的k跳邻域,以滤除具有大量边(例如<50)的顶点。过滤后的图具有数百万个边和顶点。

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

v

更好的方法可能是迭代原始未过滤图中的每个顶点,并忽略附加到高边数顶点的边,但是我不确定如何做到这一点。

尝试1:

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

不幸的是,使用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)。在出现此错误之前和之后运行其他(可能更便宜)的查询不会产生类似的错误,因此仍然存在与gremlin shell的连接。该代码也可以在gremlin shell中工作(将StreamClosedError: Stream is closed替换为is_)。

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

尝试2:

使用gremlin客户端。我尝试覆盖名称为is的另一个遍历对象。但是,覆盖操作失败(l)。

l = subgraph.traversal();

1 个答案:

答案 0 :(得分:0)

您可以从那里继续遍历:

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(...)....