将CASE结果分组为neo4j cypher

时间:2013-07-18 07:02:05

标签: neo4j cypher graph-databases

我从根节点设置链接列表,该节点链接不同的项目类型。要检索前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之后放置一个值。有没有办法将结果组合成一个像上面那样的对象?

2 个答案:

答案 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 ... ..