Фильтр пограничного атрибута при поиске мотива 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()

Вы упоминаете фильтрацию по направлению, но направление каждого отношения кодируется в самом графике (то есть от источника к месту назначения).

Другие вопросы по тегам