2016-03-25 8 views
1

Ich versuche Folger Beziehungen zwischen bestimmten Benutzern in meiner App teilen zu modellieren:bestimmte Ecken zurück und ob sie eine Kante mit einem bestimmten Vertex

Benutzer ---- ---- Benutzer

folgt

(Think Twitter)

Angesichts einer Reihe von userIds muss ich alle diese Benutzer Vertices und einen booleschen geben, wenn ein bestimmter Benutzer (currentUser) eine Kante follows für diese Benutzer hat. Also muss ich wissen, ob oder ob nicht currentUser ist jeder dieser Nutzer folgende:

user1: true

user2: true

user3: false

user4: true

Ich bin fest, wie man den folgenden Status abrufen. Wenn ich jeden Benutzer Vertex zurückkehren wie so:

currentUser = g.V(1); g.V().hasLabel("appUser").or(__.has("userId","123869681319429"), __.has("userId","103659593341656")).valueMap();

was wäre ein effizienter Befehl zu bestimmen, ob jeder von denen einen eingehenden follows Rand von currentUser hatte?

TitanDB 1.0.0 läuft auf DynamoDB.

Bearbeiten- Meine volle Arbeits Traversal Hinzufügen:

g.V().hasLabel('appUser').or(__.has('cId', '1232'),__.has('cId', '1116')).group().by().by(__.in('follows').hasId(hasLabel('appUser').has('pId', 'd13dfa6').id()).count())

Edit 2 - Ich zog diese Traversal Umschreiben besser, die Daten, die ich durch die Verwendung as() und select() erforderlich zu erfassen. Verlassen hier als Referenz:

g.V().hasLabel('appUser').or(__.has('cId', '1232'),__.has('cId', '1116')).as('user','followCount').select('user','followCount').by(__.valueMap()).by(__.in('follows').hasId(hasLabel('appUser').has('pId', 'd13dfa6').id()).count())

Antwort

3

Hier ist eine Möglichkeit, es zu tun. Angenommen, dieses Beispiel zeigt dieses Diagramm:

gremlin> graph = TinkerGraph.open() 
==>tinkergraph[vertices:0 edges:0] 
gremlin> vUser1 = graph.addVertex(id,1) 
==>v[1] 
gremlin> vUser2 = graph.addVertex(id,2) 
==>v[2] 
gremlin> vUser3 = graph.addVertex(id,3) 
==>v[3] 
gremlin> vUser1.addEdge('follows',vUser2) 
==>e[0][1-follows->2] 
gremlin> vUser3.addEdge('follows',vUser3) 
==>e[1][3-follows->3] 

Ihre Code-Snippet oben zeigt, dass Sie die „aktuellen Benutzer“ Vertex haben und die Eckpunkte des Benutzers Sie zu diesem aktuellen Benutzer vergleichen wollen, um zu sehen, ob es irgendwelche folgen Beziehungen. diese Annahme gegeben, könnte man es auf diese Weise nähern:

gremlin> g = graph.traversal() 
==>graphtraversalsource[tinkergraph[vertices:3 edges:2], standard] 
gremlin> g.V(vUser2,vUser3).group().by().by(__.in("follows").hasId(vUser1.id()).count()) 
==>[v[2]:1, v[3]:0] 

In diesem Fall wiederholen Sie die Liste der Benutzer Eckpunkten Sie gegen vergleichen wollen, dann die Gruppe auf sie. Die Durchquerung gibt ein Map aus, wobei ein Wert größer als 0 eine Folge-Beziehung darstellt und ein Wert von Null das Gegenteil von keiner Folge-Beziehung darstellt. Im obigen Beispiel folgt Benutzer 1 2, folgt aber nicht 3.

+0

Vielen Dank, das funktioniert gut. Ich habe meine vollständige Arbeitsdurchquerung zur ursprünglichen Frage hinzugefügt. Wie Sie sehen können, suche ich Benutzer basierend auf einer ID und schließe dann Ihre Logik ein. Ist es möglich, bestimmte Eigenschaften der nachgeschlagenen Benutzer (firstName, lastName, etc) anstelle der gesamten Objekte zurückzugeben? Ich bin nicht sicher, wo ich diese Eigenschaften angeben könnte. – Fook

+0

Der erste 'by()' -Modulator gibt den Schlüssel für die Map an.Du könntest ihm die Eigenschaft übergeben, um es herauszuziehen, oder vielleicht 'valueMap()' basierend auf 'Traversal', um die Eigenschaften zu entfernen. Ich denke, Map Equality würde es immer noch erlauben, richtig mit einer "Map" als Schlüssel zu gruppieren. Sie könnten auch das Ergebnis nachbearbeiten, um die 'Vertex'-Schlüssel in das zu ändern, was Sie wollen. Es gibt viele Möglichkeiten. –

+0

Das Übergeben einer einzelnen Eigenschaft an 'by()' funktioniert großartig, aber ich kann nur eine einzelne Eigenschaft auf diese Weise zurückgeben. Ich habe versucht '.by (__. ValueMap())', aber das ergibt 'org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet kann nicht in org.apache.tinkerpop.gremlin.structure.Element' umgewandelt werden . Überlasse ich das richtig? Ich versuche, nach Möglichkeit aus Leistungsgründen jede Nachbearbeitung zu vermeiden. – Fook