返回没有照片的相册的空列表

问题描述

我有一个Neo4j数据库,其中的相册包含照片列表。每张照片依次都有一个缩略图列表。我写了一个查询给我每张专辑,包括它的所有照片(包括它们的缩略图):

MATCH (a:Album)
OPTIONAL MATCH (a)<-[:BELONGS_TO]-(p:Photo)
OPTIONAL MATCH (p)<-[to:THUMBNAIL_OF]-(t:Thumbnail)
WITH a,p,{uri: t.uri,size: to.size} as thumbnails
WITH a,{id: p.id,uri: p.uri,thumbnails: collect(thumbnails)} as photo
RETURN a.id as albumId,a.name as albumName,collect(photo) as photos

查询的结果如下:

╒══════════════════════════════════╤═════════════╤═════════════════════════════════════════════════════════════════╕
│"albumId"                         │"albumName"  │"photos"                                                         │
╞══════════════════════════════════╪═════════════╪═════════════════════════════════════════════════════════════════╡
│"41dmzLK7bCP3Tbm7aVtXH-61LVgJmW57"│"Summer 2019"│[{"id":null,"thumbnails":[{"size":null,"uri":null}],"uri":null}] │
├──────────────────────────────────┼─────────────┼─────────────────────────────────────────────────────────────────┤
│"sM4hwUEAfdeQNktoGRRSW4POrugUldyF"│"New Album"  │[{"id":"VO5ixGVygrZ5Z9-H903bJ0XDY6gEbr4s","thumbnails":[{"size":"│
│                                  │             │LARGE","uri":"YVZ9Cz4P2yBPPtpadamA3yt1"},{"size":"MEDIUM","uri":"│
│                                  │             │X4TADPTbKe2CTY832TVeEdHk"},{"size":"SMALL","uri":"hyy34CeUB36HvxU│
│                                  │             │1YDVE7aTV"},{"size":"TINY","uri":"7h9ADu1Xbm1YdubBTEKVKaCA"}],"ur│
│                                  │             │i":"xHpxm7zpe1U4v6gTEAm3kdcm"}]                                  │
└──────────────────────────────────┴─────────────┴─────────────────────────────────────────────────────────────────┘

相册“ Summer 2019”不包含任何照片,我希望这些照片成为空列表,而不是将所有内容都设置为null的当前值。我认为可选匹配在这种情况下会有所帮助,但显然没有帮助。我猜这是因为我在查询中创建了自定义结构。

如何更改查询以实现这一目标?

解决方法

您可以使用pattern comprehension进行与OPTIONAL MATCH相同的操作,并在没有匹配项时自动提供空白列表:

MATCH (a:Album)
RETURN a.id AS albumId,a.name AS albumName,[(a)<-[:BELONGS_TO]-(p:Photo) |
    {id: p.id,uri: p.uri,thumbnails:
      [(p)<-[to:THUMBNAIL_OF]-(t:Thumbnail) | {uri: t.uri,size: to.size}]
    }
  ] AS photos

顺便说一句,size属性是否不应该位于Thumbnail节点上?可能允许其他一些查询更加有效。