2017-03-29 1 views
0

Je souhaite développer et rechercher des nœuds avec une certaine étiquette. Mais je veux aussi filtrer les nœuds du chemin avec une certaine étiquette. la colonne d'étiquette contient des valeurs comme « entité, personne », « entité; Organisation »ArangoDB: Rechercher une propriété et filtrer plusieurs valeurs dans le chemin

Ce que j'obtenu jusqu'à présent

LET source = (FOR x IN Entity FILTER x.objectID == @nodeId 
    Return x)[0] 
FOR node, edge, path IN [email protected] ANY source GRAPH @graph 
     FILTER CONTAINS(node.label, @search) 
     AND node != source 
     AND (CONTAINS (path.vertices[*].label, "Person") OR CONTAINS (path.vertices[*].label, "Organization") OR CONTAINS (path.vertices[*].label, "Incident")) 
     LIMIT @maxPaths 
     RETURN {node,path} 

Problèmes

  1. Le filtre est sur tous les nœuds du chemin. je voudrais filtrer sur le chemin sans source et destination.
  2. La partie contient/ou est vraiment moche. existe-t-il un meilleur moyen de filtrer pour plusieurs valeurs?

Répondre

1

1) Avec path.vertices[* LIMIT 1,LENGTH(path.vertices)-2] vous ignorez la première (source) et la dernière entrée (destination) dans le tableau de sommets.

2) Vous pouvez effectuer une itération sur les étiquettes recherchées dans une sous-requête et vérifier s'il existe dans les sommets du chemin. Si vous en trouvez un, vous quittez la sous-requête avec LIMIT 1 RETURN 1 qui vous renvoie un tableau de longueur 1 sinon vous obtenez un tableau de longueur 0. Vous pouvez ensuite filtrer sur ces longueurs.

LET labels = ["Person","Organization","Incident"] 

FOR source IN Entity FILTER source.objectID == @nodeId 
LIMIT 1 
FOR node, edge, path IN [email protected] ANY source GRAPH @graph 
    FILTER CONTAINS(node.label, @search) 
    AND node != source 
    AND LENGTH(FOR i IN labels 
    FILTER CONTAINS(path.vertices[* LIMIT 1,LENGTH(path.vertices)-2].label, i) 
    LIMIT 1 
    RETURN 1) == 1 
    LIMIT @maxPaths 
    RETURN {node,path} 

Noeud: J'utiliser labels comme paramètre de liaison. Vous pouvez donc étendre votre logique d'étiquette sans modifier la requête.