2016-05-24 3 views
0

В GraphX ​​существует ли способ получить все узлы и дуги, которые находятся на пути определенной длины? Конкретно: Я хотел бы получить все пути из 10 шагов от A до B. Для каждого пути я хотел бы получить список узлов и дуг.GraphX ​​- Извлечение всех узлов из пути

благодаря

+0

Можете ли вы дать более конкретный пример? Непонятно, о чем вы спрашиваете. Например, пытаетесь ли вы найти все узлы, которые являются частью пути с 5 узлами? Часть определенного пути? Лучше всего было бы, если бы вы предоставили некоторые примеры данных и результаты, которые вы хотели бы видеть на основе этих данных. –

+0

Нет никакого API для этого, и это не тривиально. Чтобы решить эту проблему, вам нужно вычислить все возможные «маршруты» по графику. Существуют такие API, как 'aggregateMessages' и/или' pregel', которые позволят вам построить логику, но, как я уже сказал, это не тривиальная вещь. –

+0

Какая среда удовлетворит мои потребности? Как насчет Гремлина над Титаном над Apache Spark? Можете ли использовать Гремлин выполнить мои требования? – Inbal

ответ

1

Отказ от ответственности: Это предназначено только для просмотра GraphFrames пути возможности фильтрации.

Ну, теоретически это возможно. Вы можете использовать шаблоны GraphFrames, чтобы найти пути. Давайте предположим, что ваши данные выглядит следующим образом:

import org.graphframes.GraphFrame 

val nodes = "abcdefghij".map(c =>Tuple1(c.toString)).toDF("id") 

val edges = Seq(
    // Long path 
    ("a", "b"), ("b", "c"), ("c", "d"), ("d", "e"), ("e", "f"), 
    // and some random nodes 
    ("g", "h"), ("i", "j"), ("j", "i") 
).toDF("src", "dst") 

val gf = GraphFrame(nodes, edges) 

и вы хотите, чтобы найти все пути, по крайней мере 5 узлов.

Вы можете построить следующий шаблон пути:

val path = (1 to 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 to 5).map(i => s"n$i").combinations(2).map { 
    case Seq(i, j) => col(i) !== col(j) 
}.reduce(_ && _) 

Наконец быстрая проверка:

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