2017-03-27 1 views
0

problème: J'ai un nœud de départ et je suis à la recherche de nœuds avec une certaine propriété. Mais je ne veux que les nœuds connectés avec les plus courts.ArangoDB: Trouver tous les chemins les plus courts avec des conditions

Exemple: Les nœuds verts ont l'ensemble de la propriété, mais je veux que « A » et « C » de retour, parce que « E » a un chemin plus long

graph

Qu'est-ce que Ive a obtenu à ce jour:

LET source = (FOR x IN Entity FILTER x.objectID == @nodeId 
    return x)[0] 
FOR node, edge, path IN 1..5 ANY source._id GRAPH 'm' 
FILTER CONTAINS(node.label, @search) 
    LIMIT @limit 
    RETURN path 

mais cela revient tout au lieu de seulement les chemins les plus courts

Répondre

0

Vous pouvez obtenir la distance du noeud d'origine en utilisant LENGTH(path.edges), donc si vous mettez le traversal dans un sous-requête vous pouvez trouver la plus courte longueur de chemin filtrer ensuite, puis par cette longueur:

LET allMatches = (
    FOR node, edge, path IN 1..3 ANY "[vertex_id]" GRAPH "[my_graph]" 
    FILTER CONTAINS(node.label, @search) 
    LIMIT @limit 
    RETURN {node,path}) 
LET shortestPathLength = MIN(FOR m IN allMatches COLLECT len = LENGTH(m.edges) RETURN len) 
FOR m IN allMatches 
    FILTER LENGTH(m.path.edges) == shortestPathLength 
    RETURN m.node 

Il pourrait y avoir une plus belle façon de le faire dans une requête (par exemple faire une traversée d'abord en largeur puis l'arrêter d'une façon ou d'une autre) mais je ne le vois pas.