2017-03-29 1 views
0

J'ai importé une liste de documents (dans une collection appelée "assemblies"). L'un des attributs est "parent_id". Basé sur ceci, je veux construire le graphique, qui est implicitement décrit par cet attribut.Créer une bordure à partir d'un attribut avec ArangoDB AQL

"id","name","parent_id" 
"30","Top level" 
"30.1","30.1 Child 1","30" 
"30.2","30.2 Child 2","30" 

Ceci est la requête, que je pensais me donner l'information pour créer la collection de bord (appelé « contient », il est donc de la mère à l'enfant):

FOR assy IN assemblies 
    LET parent = (
    FOR parent IN assemblies 
     FILTER parent.id == assy.parent_id 
     RETURN parent 
) 
    RETURN {_from: parent._key, _to: assy._key} 

Que suis-je mal faire? Pourriez-vous me donner la requête complète pour insérer les bords?

Répondre

2

Le problème est que le résultat de votre sous-requête dans parent est un tableau et non un document. Mais il n'y a en fait pas besoin d'une sous-requête. Vous pouvez également créer un join, qui devrait offrir de meilleures performances et être plus facile à lire. Vous devez également utiliser la valeur de au lieu de _key pour les champs _from et _to de vos bords.

La requête suivante fait exactement ce que vous voulez.

FOR assy IN assemblies 
    FOR parent IN assemblies 
    FILTER parent.id == assy.parent_id 
    INSERT {_from: parent._id, _to: assy._id} IN contains 
    RETURN NEW 

Noeud: la RETURN NEW est facultative. Vous pouvez vérifier avec elle si l'importation a réussi. Avec une plus grande quantité de données, je laisserais tomber ceci.

+0

Merci, cela a fonctionné. Il s'est avéré que le champ "id" avait deux caractères invisibles devant lui, en raison de problèmes d'encodage. Après avoir converti le fichier csv en UTF-8 de base, cela a fonctionné. Je l'ai trouvé, quand j'exportais la collection à JSON. –