在我的图中,我需要检测没有入站关系的顶点。使用下面的示例,“a”是唯一不被任何人关联的节点。
a --> b
b --> c
c --> d
c --> b
我真的很感激在我的图中检测“a”类型节点的任何示例。
谢谢
在我的图中,我需要检测没有入站关系的顶点。使用下面的示例,“a”是唯一不被任何人关联的节点。
a --> b
b --> c
c --> d
c --> b
我真的很感激在我的图中检测“a”类型节点的任何示例。
谢谢
不幸的是,该方法并不简单,因为 graph.degress、graph.inDegrees、graph.outDegrees 函数没有返回具有 0 边的顶点。(请参阅适用于 Python 的 Scala 文档https://graphframes.github.io/graphframes/docs/_site/api/scala/index.html#org.graphframes.GraphFrame)
所以下面的代码总是会返回一个空的数据框
g=Graph(vertices,edges)
# check for start points
g.inDegrees.filter("inDegree==0").show()
+---+--------+
| id|inDegree|
+---+--------+
+---+--------+
# or check for end points
g.outDegrees.filter("outDegree==0").show()
+---+---------+
| id|outDegree|
+---+---------+
+---+---------+
# or check for any vertices that are alone without edge
g.degrees.filter("degree==0").show()
+---+------+
| id|degree|
+---+------+
+---+------+
有效的是 inDegree 和 outDegree 结果的左、右或完全连接,并过滤相应列的 NULL 值
连接将为您提供在开始和结束位置具有 NULL 值的合并列
g.inDegrees.join(g.outDegrees,on="id",how="full").show()
+---+--------+---------+
| id|inDegree|outDegree|
+---+--------+---------+
| b6| 1| null|
| a3| 1| 1|
| a4| 1| null|
| c7| 1| 1|
| b2| 1| 2|
| c9| 3| 1|
| c5| 1| 1|
| c1| null| 1|
| c6| 1| 1|
| a2| 1| 1|
| b3| 1| 1|
| b1| null| 1|
| c8| 3| null|
| a1| null| 1|
| c4| 1| 4|
| c3| 1| 1|
| b4| 1| 1|
| c2| 1| 3|
|c10| 1| null|
| b5| 2| 1|
+---+--------+---------+
现在你可以过滤什么搜索
my_in_Degrees=g.inDegrees
my_out_Degrees=g.outDegrees
# get starting vertices (no more childs)
my_in_Degrees.join(my_out_Degrees,on="id",how="full").filter(my_in_Degrees.inDegree.isNull()).show()
+---+--------+---------+
| id|inDegree|outDegree|
+---+--------+---------+
| c1| null| 1|
| b1| null| 1|
| a1| null| 1|
+---+--------+---------+
# get ending vertices (no more parents)
my_in_Degrees.join(my_out_Degrees,on="id",how="full").filter(my_out_Degrees.outDegree.isNull()).show()
+---+--------+---------+
| id|inDegree|outDegree|
+---+--------+---------+
| b6| 1| null|
| a4| 1| null|
|c10| 1| null|
+---+--------+---------+