2010-06-02 18 views

Répondre

4

Dans de nombreux cas, la structure du domaine peut être exploitée pour améliorer les performances. Disons que vous savez qu'en général, vos entités A ont moins de relations x par rapport au nombre de relations y sur les entités B. Ensuite, vous pouvez parcourir deux étapes à partir du nœud A et voir où se trouve le nœud B, puis filtrer les nœuds C de cette façon. Voici un code pour cette approche:

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; 
     } 
    } 
} 

Une autre façon serait de commencer à deux fils qui analyse les relations de part et d'autre.

Une troisième approche consisterait à créer un index spécialisé qui aiderait à répondre à ce type de requêtes, ce qui nuirait manifestement aux performances d'insertion.

8

Dans Gremlin (http://gremlin.tinkerpop.com), cela est exprimé en tant que tel:

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

Voici ce que chaque étape fait:

  1. départ à Seta (A1, A2, A3 dans votre exemple).
  2. démarrer un pipeline Gremlin.
  3. prendre les «x» marqués sortants de ces sommets setA à C1, C2 et C3.
  4. prendre les bords marqués «y» de C1, C2 et C3. Toutes les étapes qui ne sont pas dans setB (donc, seuls les chemins C2 et C3 existent).
  5. revenez à ce que vous avez vu il y a 2 étapes - donc, C2 et C3.

Tada!

Bonne chance, Marko.

http://markorodriguez.com

+0

Je veux obtenir les sommets de l'objet GremlinePipeline, Pouvez-vous s'il vous plaît me dire comment cela en Java achive Api. Voici le code que j'utilise: GremlinPipeline pipeline = new GremlinPipeline (vert) .out ("LIVES_IN_CITY"). In ("LIVES_IN_CITY"). Filter (nouveau PipeFunction() {public Booléen calcul (Vertex v) {return v. getProperty ("name"). est égal à (city);}}). back (2) .out ("LIVES_IN_CITY"); – RCS