Фильтр пограничного атрибута при поиске мотива GraphFrames не работает
У меня есть пример данных на графе семейства, к которому я хочу обратиться.
Я хотел бы использовать метод find для объекта GraphFrames, чтобы запросить мотив A->B, где ребро имеет тип "Мать".
Поскольку GraphFrames использует подмножество языка шифров Neo4J, мне было интересно, будет ли следующий запрос правильным?
graph.find("(A)-[edge:Mother]->(B)").show
Или как лучше всего реализовать это в GraphFrames?
GraphFrame(vertex, graph.edges.filter("attr=='Mother'")).vertices.show
Это не работает, так как я не могу фильтровать направление, поэтому я хочу получить только матерей:)
Любая идея?
1 ответ
Предположим, это ваши тестовые данные:
import org.graphframes.GraphFrame
val edgesDf = spark.sqlContext.createDataFrame(Seq(
("a", "b", "Mother"),
("b", "c", "Father"),
("d", "c", "Father"),
("e", "b", "Mother")
)).toDF("src", "dst", "relationship")
val graph = GraphFrame.fromEdges(edgesDf)
graph.edges.show()
+---+---+------------+
|src|dst|relationship|
+---+---+------------+
| a| b| Mother|
| b| c| Father|
| d| c| Father|
| e| b| Mother|
+---+---+------------+
Вы можете использовать запрос мотива и применить к нему фильтр:
graph.find("()-[e]->()").filter("e.relationship = 'Mother'").show()
+------------+
| e|
+------------+
|[a,b,Mother]|
|[e,b,Mother]|
+------------+
Или, поскольку ваш случай относительно прост, вы можете применить фильтр к краям графика:
graph.edges.filter("relationship = 'Mother'").show()
+---+---+------------+
|src|dst|relationship|
+---+---+------------+
| a| b| Mother|
| e| b| Mother|
+---+---+------------+
Вот некоторый альтернативный синтаксис (каждый получает тот же результат, что и выше):
graph.edges.filter($"relationship" === "Mother").show()
graph.edges.filter('relationship === "Mother").show()
Вы упоминаете фильтрацию по направлению, но направление каждого отношения кодируется в самом графике (то есть от источника к месту назначения).