2016-07-07 1 views
0

J'évalue actuellement OrientDB (2.1.16) comme une solution possible à la construction d'un recommandeur de similarité. À cette fin, j'aimerais aide écrire une requête initiale qui accomplit ce qui suit:Trouver les sommets partagés les plus communs dans OrientDB

Vertex:Maker -(Edge:Produced)-> Vertex:Item -(Edge:TaggedBy)-> Vertex:Tag 
  1. Je voudrais sélectionner un élément particulier (V1) et obtenir une liste de retour d'autres articles commandés par le (Vn) nombre de Tags en commun avec V1;
  2. Par extension, je voudrais prendre un fabricant sélectionné (V2) et traverser les articles pour obtenir une liste ordonnée de fabricants (et les articles traversés, si possible) qui partagent des étiquettes.

Il n'y a pas énormément de documentation détaillée sur l'application de l'intersection de cette manière. Pas de contraintes inhabituelles en particulier. Il y aurait des milliers d'articles et de fabricants et probablement 10 fois plus de tags.

+0

Salut, ça pourrait être utile une fonction JS? –

+0

En tant que script côté serveur? Cela semble fonctionner. J'avais espéré une requête directe, mais j'y réfléchirai en option. Merci pour la suggestion. – CrustyRatFink

+1

est-ce une contrainte à utiliser 2.1.16? La dernière version stable (2.2.3) inclut la nouvelle instruction MATCH, qui facilite grandement ce type de tâches. –

Répondre

0

J'ai essayé avec ce petit exemple de graphique

enter image description here

J'ai utilisé cette requête

select item.name, count(tag)from (
    select from (
     MATCH { 
      CLASS:Item, AS:item, WHERE: (name<>'v1') 
     } 
     .out("TaggedBy"){AS:tag} 
     return item, tag 
    ) where tag in (
     select expand(tag) from (
      MATCH { 
       CLASS:Item, AS:item, WHERE: (name='v1') 
      }.out("TaggedBy"){AS:tag} 
      return tag 
     ) 
    ) 
) group by item order by count desc 

et je suis arrivé à ce résultat

enter code here

Hope it helps.

+0

Merci pour la solution. J'ai laissé tomber cette approche après avoir conclu que mon cas d'utilisation était mieux adapté à une base de données relationnelle standard puisque je ne traverse pas les relations. – CrustyRatFink