4

我正在尝试使用 GraphFrames 查找从节点 A 到节点 B 且 pathLength < 10 的所有路径。我可以使用以下代码来做到这一点,但是,我想知道是否有更好的方法来做到这一点。

val graph = GraphFrame(vertices, edges)


val motif1 = graph.find("(start)-[]->(d1)").select($"start.id".as("start_id"), $"d1.id".as("end_id"))
val motif2 = graph.find("(start)-[]->(d1); (d1)-[]->(d2)").select($"start.id".as("start_id"), $"d2.id".as("end_id"))
val motif3 = graph.find("(start)-[]->(d1); (d1)-[]->(d2); (d2)-[]->(d3)").select($"start.id".as("start_id"), $"d3.id".as("end_id"))
val motif4 = graph.find("(start)-[]->(d1); (d1)-[]->(d2); (d2)-[]->(d3); (d3)-[]->(d4)").select($"start.id".as("start_id"), $"d4.id".as("end_id"))
val motif5 = graph.find("(start)-[]->(d1); (d1)-[]->(d2); (d2)-[]->(d3); (d3)-[]->(d4)  ; (d4)-[]->(d5) ").select($"start.id".as("start_id"), $"d5.id".as("end_id"))
val motif6 = graph.find("(start)-[]->(d1); (d1)-[]->(d2); (d2)-[]->(d3); (d3)-[]->(d4)  ; (d4)-[]->(d5) ;  (d5)-[]->(d6)").select($"start.id".as("start_id"), $"d6.id".as("end_id"))
val motif7 = graph.find("(start)-[]->(d1); (d1)-[]->(d2); (d2)-[]->(d3); (d3)-[]->(d4) ; (d4)-[]->(d5) ;  (d5)-[]->(d6) ;  (d6)-[]->(d7) ").select($"start.id".as("start_id"), $"d7.id".as("end_id"))
val motif8 = graph.find("(start)-[]->(d1); (d1)-[]->(d2); (d2)-[]->(d3); (d3)-[]->(d4) ; (d4)-[]->(d5) ;  (d5)-[]->(d6) ;  (d6)-[]->(d7) ;  (d7)-[]->(d8) ").select($"start.id".as("start_id"), $"d8.id".as("end_id"))
val motif9 = graph.find("(start)-[]->(d1); (d1)-[]->(d2); (d2)-[]->(d3); (d3)-[]->(d4); (d4)-[]->(d5) ;  (d5)-[]->(d6) ;  (d6)-[]->(d7) ;  (d7)-[]->(d8) ;  (d8)-[]->(d9)").select($"start.id".as("start_id"), $"d9.id".as("end_id"))
val motif10 = graph.find("(start)-[]->(d1); (d1)-[]->(d2); (d2)-[]->(d3); (d3)-[]->(d4); (d4)-[]->(d5) ;  (d5)-[]->(d6) ;  (d6)-[]->(d7) ;  (d7)-[]->(d8) ;  (d8)-[]->(d9) ;  (d9)-[]->(d10)").select($"start.id".as("start_id"), $"d10.id".as("end_id"))

val combined = motif1.union(motif2).union(motif3).union(motif4).union(motif5).union(motif6).union(motif7).union(motif8).union(motif9).union(motif10)
4

1 回答 1

0

这是我在pySpark中的实现:

def createMotif(length):
    motifPath = "(a)-[e0]->"
    for i in range(1, length):
        motifPath += "(n%s);(n%s)-[e%s]->" % (i - 1, i - 1, i)
    motifPath += "(z)"
    return motifPath

init_motifs = {}
for length in range(1, 11):
    motifPath = createMotif(length)
    current_motif = g.find(motifPath)
    init_motifs[length] = current_motif
于 2018-07-09T21:08:31.947 回答