2016-02-22 1 views
0

J'utilise Neo4j, et j'ai un graphique comme celui-ci:Comment imbriquer plusieurs résultats dans neo4j?

A Collection a beaucoup Image s:

(`Collection`)-[:contains]->(`Image`) 

Un Image a beaucoup Tag s:

(`Image`)-[:has_tag]->(`Tag`) 

Je veux pour sélectionner mes Collection s avec certaines conditions, la collecte des images liées et des balises dans une structure imbriquée, de sorte que chaque ligne contient un Collection distinct, le r images exaltées et une liste d'étiquettes pour chaque image.

MATCH (c:`Collection`) WHERE some_condition_on(c) OPTIONAL MATCH (i:`Image`)<-[:contains]-(c) OPTIONAL MATCH (i)-[:has_tag]->(t:`Tag`) RETURN i, collect(????) 

Par exemple, voici comment la sortie peut être:

Node:`Collection `, [ 
    [Node:`Image`, [Node:`Tag`, Node:`Tag`, Node:`Tag`, Node:`Tag`]], 
    [Node:`Image `, [Node:`Tag`, Node:`Tag`, Node:`Tag`, Node:`Tag`]], 
    [Node:`Image `, [Node:`Tag`, Node:`Tag`, Node:`Tag`, Node:`Tag`]] 
] 

Y at-il un moyen d'obtenir cela en utilisant les fonctions de collecte de Neo4j?

Répondre

1

Cela peut fonctionner pour vous:

MATCH (c:Collection)-[:contains]->(i:Image)-[:has_tag]->(t:Tag) 
WITH c, [i, COLLECT(t)] AS imgs 
RETURN c, COLLECT(imgs) AS images; 

Chaque ligne aura un nœud Collection, et un tableau qui est structuré comme cet exemple:

[ 
    [(:Image), 
    [(:Tag)] 
    ], 
    [(:Image), 
    [(:Tag), (:Tag)] 
    ], 
    [(:Image), 
    [(:Tag)] 
    ] 
] 

REMARQUE: L'exemple simple ci-dessus ne retourner les collections qui ont au moins une image, et les images qui ont au moins une étiquette.