2017-06-16 10 views
2

私が照会したいファミリーグラフのサンプルデータがあります。GraphFramesモチーフ検索のエッジ属性フィルタが機能しない

エッジが「マザー」タイプのモチーフA-> Bを照会するために、GraphFramesオブジェクトでfindメソッドを使用したいと思います。

GraphFramesはNeo4Jのサイファー言語のサブセットを使用しているので、次のものが正しいクエリであるかどうか疑問に思っていましたか?

graph.find("(A)-[edge:Mother]->(B)").show 

これをGraphFrameで実装するにはどうすればよいでしょうか?

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() 

あなたは方向のフィルタリングについて言及していますが、各関係の方向はグラフ自体に符号化されています。ソースから目的地まで)。

関連する問題