在NEO4J中重新调整复杂的树状结构,没有重复

我有一个getPhotosInBucket方法,它返回一个给定的桶中存在[:IN]关系的所有照片,每个照片都有自己的关系集合,每个getPhotosInBucket都包含对应于不同版本图像的属性。 小,中等,缩略图等。为了使事情更加复杂,每张照片也有一个创作者,每个创作者都有一个缩略图,像一张照片一样有多个与之相关的Meta节点。

以下是将要返回的内容的简化版本。 在这个例子中,只有一个用户创build了这个桶并创build了每张照片,但是在现实世界中,用户James可能会有一个包含100个不同图像的桶,每个图像都有自己的创build者,缩略图和创build者缩略图。

用来返回这个数据的查询有点冗长,只是为了展示我的结构,并生成一个可视化的graphics:

  MATCH (album:Asset:Album:Bucket {name: 'Bucketjamesprivate'}) MATCH (album)<-[:CREATED]-(creator) OPTIONAL MATCH (album)<-[:THUMBNAIL]-(albumThumb)<-[:META]-(albumThumbMeta) OPTIONAL MATCH (creator)<-[:THUMBNAIL]-(creatorThumb) OPTIONAL MATCH (creatorThumb)<-[:META]-(creatorThumbMeta) OPTIONAL MATCH (album)<-[:IN]-(photos)<-[:META]-(meta) OPTIONAL MATCH (photos)<-[:CREATED]-(photoOwner)<-[:THUMBNAIL]-(photoThumbnail)<-[:META]-(photoThumbnailMeta) RETURN DISTINCT album, albumThumb, albumThumbMeta, creator, creatorThumb, photos, meta, photoOwner, photoThumbnailMeta 

这最终返回以下内容:

在这里输入图像说明

正如你所看到的,James创造了1个桶,1个桶缩略图和3个元节点,2个在桶中的每个都有3个元节点,最后他有一个缩略图和3个元节点。

实际返回的行数是54,只有当我把一堆照片放回去时,才能成倍增长,所以也许有更高效的方法来做这件事。

我已经尝试使用收集方法,但它引入了一些奇怪的重复,我敢肯定,但我不明白为什么足够好。

我希望我的方法最终返回的对象将是这样的:

  { album: { name: 'etc', foo: 'bar', bar: 'foo' }, albumThumb: [ { type: 'small', src: 'www.foo.com/small' }, { type: 'medium', src: 'www.foo.com/medium' } ], creator: { name: 'James', foo: 'bar' }, creatorThumb: [ { type: 'small', src: 'www.foo.com/small' }, { type: 'medium', src: 'www.foo.com/medium' } ], photos: [ { photo: { name: 'Photo 1', date: '112432543636' }, meta: [ { type: 'small', src: 'www.foo.com/small' }, { type: 'medium', src: 'www.foo.com/medium' } ], creator: { name: 'James', foo: 'bar' }, creatorThumb: [ { type: 'small', src: 'www.foo.com/small' }, { type: 'medium', src: 'www.foo.com/medium' } ] }, { photo: { name: 'Photo 2', date: '112432543636' }, meta: [ { type: 'small', src: 'www.foo.com/small' }, { type: 'medium', src: 'www.foo.com/medium' } ], creator: { name: 'James', foo: 'bar' }, creatorThumb: [ { type: 'small', src: 'www.foo.com/small' }, { type: 'medium', src: 'www.foo.com/medium' } ] } ] } 

无论是在一个桶中的照片或是其他节点的缩略图的照片,每张照片只有less数元节点。

我也想让前端的客户端分页照片,有没有一种方法可以LIMITSKIP存储桶中的照片?

我应该以不同的方式处理这两件事情吗? 一个得到专辑,albumThumb,创造者,creatorThumb和另一个得到照片和相关的拇指?

我现在有更多的时间了,让我试一试;)

 MATCH (album:Asset:Album:Bucket {name: 'Bucketjamesprivate'}) MATCH (album)<-[:CREATED]-(creator) OPTIONAL MATCH (album)<-[:THUMBNAIL]-(albumThumb)<-[:META]-(albumThumbMeta) WITH album, collect({src: albumThumb.src, type: albumThumbMeta.type}) AS albumThumbs, creator OPTIONAL MATCH (creator)<-[:THUMBNAIL]-(creatorThumb)<-[:META]-(creatorThumbMeta) WITH album, albumThumbs, creator, collect({src: creatorThumb.src, type: creatorThumbMeta.type}) AS creatorThumbs OPTIONAL MATCH (album)<-[:IN]-(photo)<-[:META]-(photoMeta) OPTIONAL MATCH (photo)<-[:CREATED]-(photoOwner)<-[:THUMBNAIL]-(ownerThumb) <-[:META]-(ownerThumbMeta) WITH album, albumThumbs, creator, creatorThumbs, photo, collect({src: photo.src, type: photoMeta.type}) AS photoMeta, photoOwner, collect({src: ownerThumb.src, type: ownerThumbMeta.type}) AS ownerThumbs RETURN album, albumThumbs, creator, creatorThumbs, collect({ photo: photo, meta: photoMeta, owner: photoOwner, ownerThumbs: ownerThumbs}) AS photos 

希望这会为你做,或者至less让你足够接近!

这是我的CREATE语句,顺便说一下,如果有人想要给它一个镜头:

 CREATE (bucket:Bucket {name: 'Bucketjamesprivate'})<-[:CREATED]-(james:Person {name: 'James'}), (p1:Photo)-[:IN]->(bucket), (p1)<-[:CREATED]-(james), (p1)<-[:META]-(:Meta {type: 'small'}), (p1)<-[:META]-(:Meta {type: 'medium'}), (p1)<-[:META]-(:Meta {type: 'small_sq'}), (p2:Photo)-[:IN]->(bucket), (p2)<-[:CREATED]-(james), (p2)<-[:META]-(:Meta {type: 'small'}), (p2)<-[:META]-(:Meta {type: 'medium'}), (p2)<-[:META]-(:Meta {type: 'small_sq'}), (bucket_thumb:Thumbnail)-[:THUMBNAIL]->(bucket), (bucket_thumb)<-[:CREATED]-(james), (bucket_thumb)<-[:META]-(:Meta {type: 'small'}), (bucket_thumb)<-[:META]-(:Meta {type: 'medium'}), (bucket_thumb)<-[:META]-(:Meta {type: 'small_sq'}), (james_thumb:Thumbnail)-[:THUMBNAIL]->(james), (james_thumb)<-[:CREATED]-(james), (james_thumb)<-[:META]-(:Meta {type: 'small'}), (james_thumb)<-[:META]-(:Meta {type: 'medium'}), (james_thumb)<-[:META]-(:Meta {type: 'small_sq'})