Graphframes BFS issue



我正在测试GraphFrames BFS玩具示例:

val g: GraphFrame = examples.Graphs.friends
val paths: DataFrame = g.bfs.fromExpr("name = 'Esther'").toExpr("name <> 'Esther'").run()

我得到的结果是:

+-------------+------------+------------+
|         from|          e0|          to|
+-------------+------------+------------+
|[e,Esther,32]|[e,f,follow]|[f,Fanny,36]|
|[e,Esther,32]|[e,d,friend]|[d,David,29]|
+-------------+------------+------------+

这很奇怪,因为范妮和大卫也有外向的边缘。链接到它们的顶点也具有外向的边缘,例如,结果数据框不仅包含一个hop路径,而且还包含来自源顶点的所有路径。

我本人创建了一个玩具图:

1 2
2 3
3 4
4 5

当我进行相同的查询时:

g.bfs.fromExpr("id = 1").toExpr("id <> 1").run() 

我仍然只得到一个跃迁邻居。我想念什么吗?我还测试了如果没有成功的情况下代表"不平等"的其他运营商。一个疯狂的猜测:也许当BFS再次到达源顶点时(它应该查看它,但不要访问其邻居),它与" toexpr"表达式和中断不符。

另一个问题:GraphFrames是指导的,不是吗?为了获得"非直接图",我应该添加相互的边缘,不是吗?

到达范妮和大卫后,您找到了从以斯帖到非操网的最短路径,因此搜索停止。

根据《 GraphFrames用户指南》,bfs方法"找到从一个顶点(或一组顶点)到另一个顶点(或另一个顶点)(或一组顶点)的最短路径。开始和结束顶点指定为Spark DataFrame表达式。"

在您使用的图表中,最短路径从以斯帖到非概述节点只是一个跳跃,因此广度优先搜索停在那里。

考虑您的数字玩具图。您正在发现这个(一个跳):

import org.graphframes.GraphFrame
val edgesDf = spark.sqlContext.createDataFrame(Seq(
  (1, 2),
  (2, 3), 
  (3, 4),
  (4, 5)    
)).toDF("src", "dst")
val g = GraphFrame.fromEdges(edgesDf)
g.bfs.fromExpr("id = 1").toExpr("id <> 1").run().show()
+----+-----+---+
|from|   e0| to|
+----+-----+---+
| [1]|[1,2]|[2]|
+----+-----+---+

假设您这样询问它:

g.bfs.fromExpr("id = 1").toExpr("id > 3").run().show()
+----+-----+---+-----+---+-----+---+
|from|   e0| v1|   e1| v2|   e2| to|
+----+-----+---+-----+---+-----+---+
| [1]|[1,2]|[2]|[2,3]|[3]|[3,4]|[4]|
+----+-----+---+-----+---+-----+---+

现在bfs方法获得了三个啤酒花。这是从1到大于3的节点的最短路径,即使有4到5(和5> 3)的边缘,但它不会继续,因为这将是更长的路径(四个啤酒花)。<<<<<</p>

另一个问题:GraphFrames是指导的,不是吗?为了获得"非直接图",我应该添加相互的边缘,不是吗?

我认为这取决于您要应用于图的算法。有人可以编写一种忽略基础edges数据帧中方向的算法。但是,如果算法假定有向图,那么我认为您是对的:您必须添加相互的边缘。

,如果您将其作为一个单独的问题,您可能会得到更好的答复。

相关内容

  • 没有找到相关文章

最新更新