2010-06-02 8 views

Antwort

4

In vielen Fällen kann die Struktur der Domäne genutzt werden, um die Leistung zu verbessern. Nehmen wir an, Sie wissen, dass Ihre A Entitäten im Allgemeinen weniger x Beziehungen haben als die y Beziehungen auf den B Entitäten. Dann können Sie zwei Schritte vom A-Knoten aus durchlaufen und sehen, wo der Knoten B erscheint, und die Knoten C auf diese Weise herausfiltern. Hier ist ein Code für diesen Ansatz:

Set<Node> found = new HashSet<Node>(); 
for (Relationship firstRel : a1.getRelationships(Reltypes.x, Direction.OUTGOING)) 
{ 
    Node cNode = firstRel.getEndNode(); 
    for (Relationship secondRel : cNode.getRelationships(Reltypes.y, Direction.INCOMING)) 
    { 
     Node bNode = secondRel.getStartNode(); 
     if (bNode.equals(b1)) 
     { 
      found.add(cNode); 
      break; 
     } 
    } 
} 

Eine andere Möglichkeit, zwei Threads zu starten wäre, die die Beziehungen von beiden Seiten scannen.

Ein dritter Ansatz wäre es, einen spezialisierten Index zu erstellen, mit dem diese Art von Abfragen beantwortet werden könnte, was die Leistung der Einfügung natürlich beeinträchtigen würde.

8

In Gremlin (http://gremlin.tinkerpop.com) wird diese als solche ausgedrückt:

  1. Start am Seta (A1, A2, A3 in Ihrem Beispiel):

    setA._().out('x').in('y').retain(setB).back(2) 
    

    Hier ist, was jeder Schritt tut, ist.

  2. starten Sie eine Gremlin-Pipeline.
  3. nehmen Sie die ausgehenden "x" markierten Kanten von diesen setA Vertices zu C1, C2 und C3.
  4. nehmen Sie die eingehenden "y" markierten Kanten von C1, C2 und C3.
  5. alle Schritte herausfiltern, die nicht in setB sind (daher existieren nur C2- und C3-Pfade).
  6. zurück zu dem, was Sie vor 2 Schritten sahen - also, C2 und C3.

Tada!

Viel Glück, Marko.

http://markorodriguez.com

+0

Ich mag die Eckpunkte aus dem GremlinePipeline-Objekt erhalten, können Sie mir bitte sagen, wie diese Api in Java achive. Unten ist der Code, den ich benutze: GremlinPipeline pipeline = neue GremlinPipeline (vert) .out ("LIVES_IN_CITY"). In ("LIVES_IN_CITY"). Filter (neue PipeFunction() {public Boole'sche Berechnung (Vertex v) {return v. getProperty ("name"). equals (Stadt);}}). zurück (2) .out ("LIVES_IN_CITY"); – RCS