2016-12-21 3 views
1

Mein Setup:Finding Eckpunkte mit genauen Randspiele durchqueren durch Kinder

Ich bin mit einer großen Grafik von Menschen Eckpunkten mit Orientdb. Ich benutze den Gremlin-Java-Treiber, um auf diese Datenbank zuzugreifen, da ich irgendwann auf eine andere Grafikdatenbank wechseln möchte.

Meine Datenbank:

Jeder Mensch hat bestimmte Vorlieben Eckpunkten (über einen markierten Rand verbunden beschreibt, dass die Beziehung zu dieser Präferenz). Alle Präferenzen werden dann mit dem Hauptkonzeptknoten verbunden.

Problem Ich versuche zu lösen:

Ich versuche, einen Weg zu finden (ein dickes Lob, wenn seine so einfach wie eine Gremlin Abfrage) an einer Person Scheitel starten und durchqueren nach unten für alle Menschen mit identische Präferenzen über ein Kernkonzept.

Hier ist ein Beispiel für ein passendes Gehäuse. Person B wird in einer Liste der perfekten Übereinstimmungen von Personen zurückgegeben, wenn Sie bei Person A beginnen. Ich habe vergessen, die Richtungen zu diesen Kanten auf diesem Bild zu zeichnen:/Werfen Sie einen Blick auf den nicht übereinstimmenden Fall, um die Richtungen zu sehen. Hier

Matching Case

ist ein Beispiel eines nicht passenden Fall. Person B wird nicht in einer Liste der perfekten Übereinstimmungen von Personen zurückgegeben. Warum? Weil alle ausgehenden Kanten auf Person B nicht zu identisch übereinstimmenden Kanten auf Person A aufgelöst werden; In diesem Fall weigert sich Person A, Äpfel zu essen, aber Person B erwähnt keine ähnliche Vorliebe für alles, was sie sich weigern zu essen.

Non matching case

Ein weiterer nicht passenden Fall aus dem obigen Beispiel: Wenn Person A weigert sich weigert zu essen Äpfel und Person B Bananen zu essen - sie nicht übereinstimmen.

Wenn Person B Fries am meisten mag und Cheeseburger am wenigsten mag, wäre das auch ein nicht übereinstimmender Fall.

Meine erste Idee (die ich nicht sicher bin, wie zu implementieren) mit einer Abfrage

  1. Ich würde Person beginnen A
  2. Suche alle ausgehenden Kanten zu Vorzug Ecken und speichere eine Art von "marker" oder mappe diesen Präferenzknoten mit der Kantenbeschriftung.
  3. Diese Scheitelpunkte entlang aller SimilarTo etikettierten Kanten ausfahren. Kopieren Sie diese Markierungen vom Präferenzknoten in den Konzeptknoten.
  4. die Linie Reverse: Konzept Vertex -> Präferenz Vertex (Kopie Macher vom Konzept bis zur Präferenz Vertex)
  5. ... dann irgendwie auf diese Markierungen alle Kanten passen ...
  6. Person ein von den Ergebnissen ausschließen

Irgendwelche Ideen?

+0

Nachforschungen ... vielleicht kann ein Match Step funktionieren? Müssen etwas experimentieren. – Mike

+0

Äpfel haben keine 'shneseTo'-Kante. Bedeutet das, dass es immer optional ist? –

Antwort

2

Beginnen wir mit der Erstellung Ihrer Probe Graph starten:

gremlin> g = TinkerGraph.open().traversal() 
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] 
gremlin> g.addV("person").property("name", "Person A").as("pa"). 
......1> addV("person").property("name", "Person B").as("pb"). 
......2> addV("food").property("name", "Hamburgers").as("hb"). 
......3> addV("food").property("name", "Chips").as("c"). 
......4> addV("food").property("name", "Cheeseburgers").as("cb"). 
......5> addV("food").property("name", "Fries").as("f"). 
......6> addV("category").property("name", "Burgers").as("b"). 
......7> addV("category").property("name", "Appetizers").as("a"). 
......8> addE("most").from("pa").to("hb"). 
......9> addE("most").from("pb").to("cb"). 
.....10> addE("least").from("pa").to("c"). 
.....11> addE("least").from("pb").to("f"). 
.....12> addE("similar").from("hb").to("b"). 
.....13> addE("similar").from("cb").to("b"). 
.....14> addE("similar").from("c").to("a"). 
.....15> addE("similar").from("f").to("a").iterate() 

Die Abfrage, sind Sie für suchen, ist die folgende (Ich werde jeden Schritt später erklären): Jetzt

gremlin> g.V().has("person", "name", "Person A").as("p"). 
......1> outE("most","least","refuses").as("e").inV().out("similar"). 
......2> store("x").by(constant(1)). 
......3> in("similar").inE().where(eq("e")).by(label).outV().where(neq("p")). 
......4> groupCount().as("m"). 
......5> select("x").by(count(local)).as("c"). 
......6> select("m").unfold(). 
......7> where(select(values).as("c")).select(keys).values("name") 
==>Person B 

wenn wir die „weigert sich zu essen Äpfel“ Beziehung hinzufügen:

gremlin> g.V().has("person", "name", "Person A").as("p"). 
......1> addV("food").property("name", "Apples").as("a"). 
......2> addV("category").property("name", "Fruits").as("f"). 
......3> addE("refuses").from("p").to("a"). 
......4> addE("similar").from("a").to("f").iterate() 

... Person B ist nicht mehr gewachsen:

gremlin> g.V().has("person", "name", "Person A").as("p"). 
......1> outE("most","least","refuses").as("e").inV().out("similar"). 
......2> store("x").by(constant(1)). 
......3> in("similar").inE().where(eq("e")).by(label).outV().where(neq("p")). 
......4> groupCount().as("m"). 
......5> select("x").by(count(local)).as("c"). 
......6> select("m").unfold(). 
......7> where(select(values).as("c")).select(keys).values("name") 
gremlin> 

Lassen Sie uns Schritt/Zeile der Abfrageschritt durchlaufen Zeile:

g.V().has("person", "name", "Person A").as("p"). 

Diese ziemlich klar sein sollte: ab Person A.

outE("most","least","refuses").as("e").inV().out("similar"). 

Traverse die aus Kanten und Setzen Sie eine Markierung, damit wir später auf die Kanten verweisen können. Dann traverse zu dem, was ich category Scheitelpunkte nannte.

store("x").by(constant(1)). 

Für jeden category Vertex eine 1 auf eine interne Sammlung. Sie könnten auch den Scheitelpunkt selbst speichern, aber das wäre eine Verschwendung von Speicher, da wir keine Informationen von den Scheitelpunkten benötigen.

in("similar").inE().where(eq("e")).by(label).outV().where(neq("p")). 

Traverse der anderen Richtung entlang der Kanten similar zum food und dann entlang dieser Kanten, die die gleiche Bezeichnung wie die markierte Kante von Anfang an haben. Am Ende ignoriere die Person, wo die Traversierung begonnen hat (Person A).

Zählen Sie die Anzahl der Überquerungen, die es zu jedem Personenknoten gemacht hat.

select("x").by(count(local)).as("c"). 

Zähle die Anzahl der Category Vertices (die 1 s).

select("m").unfold(). 

Entfalten die Person Zähler, so werden die Schlüssel der Person Eckpunkte sein und die Werte werden die Anzahl der Schiebebühnen, die es zu diesem Scheitelpunkt gemacht.

where(select(values).as("c")).select(keys).values("name") 

letztlich die Zahl der gekreuzten category Eckpunkte müssen die Anzahl der Schiebebühnen auf einem person Vertex entsprechen. Wenn das der Fall ist, haben wir eine Übereinstimmung.

Beachten Sie, dass es erforderlich ist, dass eine Kante similar auf den Vertex Apples einfällt.

+0

Das ist schön. Genau danach suche ich! Ja, Äpfel würden eine ähnliche Kante haben - gerade lief das Zimmer aus/vergaß es hinzuzufügen. Vielen Dank! – Mike

Verwandte Themen