Apache spark GraphX-从路径检索所有节点

Apache spark GraphX-从路径检索所有节点,apache-spark,graph-databases,spark-graphx,Apache Spark,Graph Databases,Spark Graphx,在GraphX中,是否有方法检索路径上具有特定长度的所有节点和边 更具体地说,我想得到从A到B的所有10步路径。 对于每个路径,我想得到节点和边的列表 谢谢。免责声明:这仅用于显示图形帧路径过滤功能 那么从理论上讲是可能的。您可以使用模式来查找路径。假设您的数据如下所示: import org.graphframes.GraphFrame val nodes=“abcdefghij”.map(c=>Tuple1(c.toString)).toDF(“id”) val边缘=序号( //长途跋涉 (

在GraphX中,是否有方法检索路径上具有特定长度的所有节点和边

更具体地说,我想得到从A到B的所有10步路径。 对于每个路径,我想得到节点和边的列表


谢谢。

免责声明:这仅用于显示图形帧路径过滤功能

那么从理论上讲是可能的。您可以使用模式来查找路径。假设您的数据如下所示:

import org.graphframes.GraphFrame
val nodes=“abcdefghij”.map(c=>Tuple1(c.toString)).toDF(“id”)
val边缘=序号(
//长途跋涉
(“a”、“b”)、(“b”、“c”)、(“c”、“d”)、(“d”、“e”)、(“e”、“f”),
//和一些随机节点
(“g”,“h”),(“i”,“j”),(“j”,“i”)
).toDF(“src”、“dst”)
val gf=图形帧(节点、边)
您希望找到至少有5个节点的所有路径

您可以构造以下路径模式:

val path=(1到4).map(i=>s“(n$i)-[e$i]->(n${i+1})”.mkString(;)
//(n1)-[e1]->(n2);(n2)-[e2]->(n3);(n3)-[e3]->(n4);(n4)-[e4]->(n5)
和过滤器表达式以避免循环:

val expr=(1到5).map(i=>s“n$i”).组合(2).map{
案例顺序(i,j)=>col(i)!==col(j)
}.减少(&&&)
最后,快速检查:

gf.find(path).where(expr.show
// +-----+---+---+-----+---+-----+---+-----+---+
//| e1 | n1 | n2 | e2 | n3 | e3 | n4 | e4 | n5|
// +-----+---+---+-----+---+-----+---+-----+---+
//|[a,b]|[a]|[b]|[b,c]|[c,d]|[d]|[d,e]|[e]|
//|[b,c]|[b]|[c]|[c,d]|[d,e]|[e]|[e,f]|[f]|
// +-----+---+---+-----+---+-----+---+-----+---+

你能举个更具体的例子吗?不清楚你在问什么。例如,您是否尝试查找属于5节点路径的所有节点?特定途径的一部分?最好是给出一些示例数据以及基于这些数据希望看到的结果。没有API可以做到这一点,这不是一件小事。要解决这个问题,您需要通过图形计算所有可能的“路径”。有像
aggregateMessages
和/或
pregel
这样的API可以让您构建逻辑,但正如我所说的,这不是一件小事。哪种环境可以满足我的需要?小精灵、泰坦、阿帕奇星火呢?使用Gremlin能满足我的要求吗?你可以用Spark来实现——我只是说这不是小事。我敢肯定,在其他环境中,这也不是小事。这样考虑一下,如果你有100个节点,每个节点连接到10个其他节点,你可能有3亿条以上的路径,长度为10。(10阶乘是360万,然后乘以节点数量——实际数量取决于地形,但你知道了。)