2017-06-16 3 views
2

J'ai des exemples de données sur un graphique de famille sur lequel je veux effectuer une requête.Le filtre d'attribut Edge sur la recherche de motifs GraphFrames ne fonctionne pas

Je voudrais utiliser la méthode find sur l'objet GraphFrames pour interroger le motif A-> B où le bord est de type "Mother".

Puisque GraphFrames utilise un sous-ensemble du langage de chiffrement de Neo4J je me demandais si ce qui suit serait la bonne requête?

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

Ou quelle serait la meilleure façon de l'implémenter dans GraphFrames?

GraphFrame(vertex, graph.edges.filter("attr=='Mother'")).vertices.show 

Cela ne fonctionne pas puisque je ne peux pas filtrer la direction, donc je veux seulement obtenir les mères :)

Toute idée?

Répondre

1

Supposons que ce sont vos données de test:

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| 
+---+---+------------+ 

Vous pouvez utiliser une requête de motif et appliquer un filtre à elle:

graph.find("()-[e]->()").filter("e.relationship = 'Mother'").show() 

+------------+ 
|   e| 
+------------+ 
|[a,b,Mother]| 
|[e,b,Mother]| 
+------------+ 

Ou, puisque votre cas est relativement simple, vous pouvez appliquer un filtre sur les bords du graphique:

graph.edges.filter("relationship = 'Mother'").show() 

+---+---+------------+ 
|src|dst|relationship| 
+---+---+------------+ 
| a| b|  Mother| 
| e| b|  Mother| 
+---+---+------------+ 

Voici une syntaxe alternative (chacun obtient le même résultat que immédiatement ci-dessus):

graph.edges.filter($"relationship" === "Mother").show() 
graph.edges.filter('relationship === "Mother").show() 

Vous dites filtrage sur l'orientation, mais la direction de chaque relation est codé dans le graphique lui-même (à savoir de la source à la destination).