问题描述
我有一个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
节点上?可能允许其他一些查询更加有效。