orientdb - Gremlin- 查找并连接子图

标签 orientdb gremlin graph-databases

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

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

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

Networking Graph Image

结果应该是这样的:

==>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]}  

这是查询的第一部分(查找所有子网络):

g.V().hasLabel('PC').emit(cyclicPath().or().not(both())).
 repeat(__.where(without('a')).store('a').both()).until(or(cyclicPath(), hasLabel('Router'))).
 group().by(path().unfold().limit(1)).
 by(path().local(unfold().filter(hasLabel('PC')).values('id')).unfold().dedup().fold()).unfold()

我的问题是:

  1. 我可以通过从每个子网络遍历某个任意节点直到到达其他子网络上存在的节点来识别子网络之间的连接。 如何用 gremlin 编写
  2. 如何根据查询结果创建新图表?
  3. 这种类型的查询在一个大图中(比如 30M 个节点)的性能如何?

创建图形脚本:

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

最佳答案

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

What is the performance of this type of query in a big graph, say 30M nodes?

如果您修改了找到的“已连接组件”配方 here那么我假设您进一步了解了这种针对 OLTP 和 OLAP 的查询的一般费用。我想对于 3000 万个顶点,您应该查看基于 OLAP 的处理(与上面提供的脚本相反)。我想您可以在足够大且内存充足的机器上使用 TinkerGraph/GraphComputer 来完成此操作,但这可能只是 SparkGraphComputer 的工作,如 end of the recipe 所建议的那样.

我认为您的前两个问题似乎取决于您对第三个问题的处理方法和成功,并且这些最初的问题可能会变得更加集中,甚至在您做到这一点后会有所改变。或许最好尝试解决“连接组件”的 OLAP 方法,然后再提出一些更具体的问题。

关于orientdb - Gremlin- 查找并连接子图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63686014/

相关文章:

insert - 如何在插入时从 OrientDB 获取 recordid?

orientdb - OrientDB SQL SELECT 语句中如何合并字段

java - Gremlin:从 EdgeId 获取进出顶点,包括边属性

mysql - 如何有效地在数据库中存储城镇之间的距离

graph-databases - Gremlin:使用项目时为 "The provided traverser does not map to a value"

java - OrientDB 慢写

java - 用于java单元测试的嵌入式OrientDB服务器

python - 在 Azure 函数中使用 python 进行 Gremlin 操作

gremlin - CosmosDB 图 : How to update vertex having property with multiple values using gremlin?

google-analytics - 用于生成推荐的 Google 预测 API 与图形数据库?