我从根节点设置链接列表,该节点链接不同的项目类型。要检索前10个项目(可能存在关系),我正在执行以下操作:
START user=node(1)
MATCH user-[:LIST*1..10]->item
WITH item
MATCH author-[a?:AUTHOR]->item
RETURN item, a, author
这样可以正常工作并返回所需的项目,但是有一些作者属性我不想返回到客户端。所以通常我只会RETURN
所需的属性,例如。 RETURN author.name, author.location
,但如果该项目没有作者,则无效。我可以在属性上使用?
,但是我可能最终会为每个项目提供大量的null属性。
然后我找到了CASE
语句,它几乎适用于我的用例。问题是如果可能的话,我希望能够按THEN
返回多个属性。例如:
RETURN labels(item) as type,
CASE HEAD(type)
WHEN "Post" THEN (item.title, item.text, author)
WHEN "Message" THEN (item.subject, item.content)
END as item
上面的WHEN
行将返回语法错误,因为您只能在THEN之后放置一个值。有没有办法将结果组合成一个像上面那样的对象?
答案 0 :(得分:2)
在那之后使用文字集合,我们将来会添加地图支持,所以它会变得更好:)
您还可以将头部(类型)更改为项目:标签
RETURN labels(item) as type,
CASE
WHEN item:Post THEN [item.title, item.text, author]
WHEN item:Mesage THEN [item.subject, item.content]
END as item
答案 1 :(得分:0)
我想为那些登陆这里的人添加分组或建立CASE WHEN的结果。
您还可以构建基于散列或对象的集合(来自Michael Hunger示例)...
RETURN labels(item) as type,
CASE
WHEN item:Post THEN {title: item.title, text: item.text, author:author}
WHEN item:Mesage THEN {subject:item.subject, content:item.content}
END as item
在这种情况下author
可能是从之前的collect({..})
构建的。
警告但是:在那之后不要尝试收集(),Neo4j将进入狂野旋转(仅在2.0.0上测试)并且崩溃,如果幸运的话可能会恢复...
不要这样做:
WHEN item:Post THEN collect({title: item.title, text: item.text, author:author})
这对我来说听起来很正常,但没有收集的那个也有效,如果有人能够解释它会有助于更好地理解收集和CASE WHEN ..
与此同时,Cypher ... ..