Orientdb Gremlin-查找和连接子图

Orientdb Gremlin-查找和连接子图,orientdb,gremlin,graph-databases,Orientdb,Gremlin,Graph Databases,我的图包含一个无向拓扑网络数据,我的目标是构建一个查询,查找应用于特定网络规则的所有子网络,为每个子网络创建顶点,并连接它们之间有路径的子网络。其目的是通过替换一个顶点中的每个子网络子图来最小化大图。 为了找到所有的子网,我从gremlin recopies中获取了“连接组件”查询 并将我的网络规则添加到停止条件中。但是现在我很难把这个子网络连接起来 我在这里提供了示例图形脚本(使用不同的网络域),其中包含PC、路由器和其他设备节点。查询应通过对连接的PC进行分组来查找所有LAN,并为每个LAN

我的图包含一个无向拓扑网络数据,我的目标是构建一个查询,查找应用于特定网络规则的所有子网络,为每个子网络创建顶点,并连接它们之间有路径的子网络。其目的是通过替换一个顶点中的每个子网络子图来最小化大图。 为了找到所有的子网,我从gremlin recopies中获取了“连接组件”查询 并将我的网络规则添加到停止条件中。但是现在我很难把这个子网络连接起来

我在这里提供了示例图形脚本(使用不同的网络域),其中包含PC、路由器和其他设备节点。查询应通过对连接的PC进行分组来查找所有LAN,并为每个LAN返回具有路径的其他LAN ID

方向在此图中没有意义,子图之间的路径可能包含多种类型的节点(路由器、设备等)。
我的图形是OrientDB

结果应该如下所示:

==>LAN 1: {pcs: [1, 2, 3], connected LANs: [LAN 2, LAN 3]}  
==>LAN 2: {pcs: [4, 5, 6], connected LANs: [LAN 1]}  
==>LAN 3: {pcs: [8, 7], connected LANs: [LAN 1]}  
这是查询的第一部分(查找所有子网络):

我的问题是:

  • 我可以通过遍历每个子网络中的任意节点来识别子网络之间的连接,直到到达其他子网络上存在的节点我如何用gremlin写它
  • 如何根据此查询结果创建新图形
  • 这种类型的查询在一个大型图中的性能如何,比如说3000万个节点
  • 创建图形脚本:

    g = TinkerGraph.open().traversal()
    g.addV("PC").property("id","1").as("pc1").
    addV("PC").property("id","2").as("pc2").
    addV("PC").property("id","3").as("pc3").
    addV("PC").property("id","4").as("pc4").
    addV("PC").property("id","5").as("pc5").
    addV("PC").property("id","6").as("pc6").
    addV("PC").property("id","7").as("pc7").
    addV("PC").property("id","8").as("pc8").
    addV("Router").property("id","9").as("router1").
    addV("Router").property("id","10").as("router2").
    addV("Equipment").property("id","11").as("eq1").
    addV("Equipment").property("id","12").as("eq2").
    addV("Equipment").property("id","13").as("eq3").
    addV("Equipment").property("id","14").as("eq4").
    addE("Line").from("pc1").to("pc2").
    addE("Line").from("pc1").to("eq3").
    addE("Line").from("pc2").to("pc3").
    addE("Line").from("pc3").to("eq1").
    addE("Line").from("pc3").to("eq3").
    addE("Line").from("pc4").to("pc5").
    addE("Line").from("pc4").to("pc6").
    addE("Line").from("pc5").to("pc6").
    addE("Line").from("pc7").to("pc8")
    addE("Line").from("router1").to("pc7").
    addE("Line").from("router1").to("pc8").
    addE("Line").from("router1").to("eq2").
    addE("Line").from("router2").to("eq4").
    addE("Line").from("eq1").to("router1").
    addE("Line").from("eq3").to("router2").
    addE("Line").from("eq4").to("pc4").
    iterate()
    

    这不是一个很好的答案,因为我认为我必须跳到你的最后一个问题,忽略三个问题中的前两个:

    这种类型的查询在一个大型图中的性能如何,比如说3000万个节点

    如果您修改了找到的“连接组件”配方,那么我假设您进一步了解了OLTP和OLAP这类查询的一般费用。我可以想象,对于3000万个顶点,您应该考虑基于OLAP的处理(与上面介绍的脚本相反)。我想你可能可以在一台足够大、内存充足的机器上使用TinkerGraph/GraphComputer来完成这项工作,但这可能只是
    SparkGraphComputer
    的一项工作


    我认为,你的前两个问题似乎取决于你对第三个问题的态度和成功与否,而这些最初的问题可能会更加集中,甚至在你走到这一步后会有所改变。也许最好尝试解决“连接组件”的OLAP方法,然后再提出一些更具体的问题。

    您可以使用此工作区演示您的问题:谢谢您的回答!我确实计划在OLAP中尝试这一点,当我看到大图时。但是有没有比“连接组件”查询更好的方法来提取这个子图呢?我对gremlin还不熟悉,只走了一条路,但也许还有其他的gremlin api更适合我的目标。我试图得到这两个部分-找到子图和连接它们-工作在一个GRMLLIN查询,并避免在中间的java代码。感谢againI在大多数情况下,如果像您这样的用例需要对整个图形进行OLAP风格的处理,那么没有一个万能的答案。如果您还没有考虑过,您可以考虑编写自己的<代码> VistoDeals>代码> >,它将运行在<代码> GraphComputer < /代码>中。也许你可以捕捉到你所寻找的所有逻辑。我也不认为您需要尝试使用Gremlin for OLAP实现一切。如果你觉得处理某些逻辑的方法/技术显而易见且简单,我不会继续写一个小精灵查询来完成这一切。好的,谢谢。有些情况下,我不是在整个图中查找子图,而是从特定节点(限制上述查询)查找子图:g.V().hasLabel('PC','id1','id2')…,尝试查找与提供的PC ID最近的子网络。有没有办法让我的前两个问题在gremlin中发挥作用?如果你从一组足够小的顶点开始,那么你也许可以使用基于OLTP的gremlin来解决你的问题,但这是否有效取决于你的图形结构和gremlin必须通过的路径数来获得答案。假设“连接的组件”遍历在这种情况下作为OLTP为您工作,那么您可以获取该遍历的输出,并使用Gremlin将其写入另一个图形。在最粗糙的方法中,您可以在遍历结束时使用带有lambda的
    sideEffect()
    步骤来处理这些组。
    g = TinkerGraph.open().traversal()
    g.addV("PC").property("id","1").as("pc1").
    addV("PC").property("id","2").as("pc2").
    addV("PC").property("id","3").as("pc3").
    addV("PC").property("id","4").as("pc4").
    addV("PC").property("id","5").as("pc5").
    addV("PC").property("id","6").as("pc6").
    addV("PC").property("id","7").as("pc7").
    addV("PC").property("id","8").as("pc8").
    addV("Router").property("id","9").as("router1").
    addV("Router").property("id","10").as("router2").
    addV("Equipment").property("id","11").as("eq1").
    addV("Equipment").property("id","12").as("eq2").
    addV("Equipment").property("id","13").as("eq3").
    addV("Equipment").property("id","14").as("eq4").
    addE("Line").from("pc1").to("pc2").
    addE("Line").from("pc1").to("eq3").
    addE("Line").from("pc2").to("pc3").
    addE("Line").from("pc3").to("eq1").
    addE("Line").from("pc3").to("eq3").
    addE("Line").from("pc4").to("pc5").
    addE("Line").from("pc4").to("pc6").
    addE("Line").from("pc5").to("pc6").
    addE("Line").from("pc7").to("pc8")
    addE("Line").from("router1").to("pc7").
    addE("Line").from("router1").to("pc8").
    addE("Line").from("router1").to("eq2").
    addE("Line").from("router2").to("eq4").
    addE("Line").from("eq1").to("router1").
    addE("Line").from("eq3").to("router2").
    addE("Line").from("eq4").to("pc4").
    iterate()