从collect返回一个对象(cypher / neo4j)

时间:2014-03-21 15:38:32

标签: neo4j cypher

我正在尝试以用户指定的语言返回内容,或者如果找不到所选语言的内容,则返回默认语言(英语)。似乎不支持从collect语句返回对象。有没有办法获得类似的结果呢?

现在的查询:

MATCH (meta:contentMeta)<-[metaLang:HAS_META]-(content:content)-[:TAGGED_WITH]-(termNode:term)-[lang:HAS_LANGUAGE]-(langNode:termMeta)
WHERE 
    metaLang.languageCode = {language} 
    OR metaLang.languageCode = {defaultLanguage} 
    AND lang.languageCode = {language} 
    OR lang.languageCode = {defaultLanguage}
RETURN DISTINCT collect(langNode.name) AS terms, 
    content.displayType AS displayType, 
    content.savedAs AS savedAs, 
    content.webURL AS webURL, 
    content.embedSrc AS embedsrc, 
    content.UUID AS UUID
LIMIT 15

问题是我真正想要返回的是一个具有节点名称和语言代码的对象。类似的东西:

collect(langNode.name, langNode.languageCode) AS terms

或者这个:

collect(langNode.name) AS terms.name, 
collect(langNode.languageCode) AS terms.languageCode

当然,这种语法不起作用。有没有简单的解决方案?

2 个答案:

答案 0 :(得分:5)

我不确定我的模型究竟是如何工作的,但您可以通过地图和集合文字来实现您想要的效果。对于您的第一个示例,您可以尝试

collect ( [langNode.name, langNode.languageCode] ) as terms

和第二个例子

{name:collect (langNode.name), languageCode:collect (langNode.languageCode) } as terms

collect ( {name:langNode.name, languageCode:langNode.languageCode} ) as terms

答案 1 :(得分:3)

我不确定您的模型是如何工作的,但我看到了一些可能的错误和优化机会。

在我建议的下面的Cypher查询中,我在第1行添加了几个箭头,以表明我认为正确的关系方向性 - 这可以加快速度。我还删除了不需要的变量名。

此外,目前尚不清楚您当前的BOOLEAN测试是否(始终)按预期工作,因为neo4j手册未记录OR和AND运算符之间的运算符优先级。所以,我简化了BOOLEAN测试并确保他们(总是)按照预期工作,使用&#39; IN&#39;操作

最后,我认为你不需要collect(),因为每个术语可能只有一种语言。

MATCH (:contentMeta)<-[metaLang:HAS_META]-(content:content)<-[:TAGGED_WITH]-(:term)-[lang:HAS_LANGUAGE]->(langNode:termMeta)
WHERE metaLang.languageCode IN [{language}, {defaultLanguage}] AND lang.languageCode IN [{language}, {defaultLanguage}]
RETURN DISTINCT {name:langNode.name, languageCode:langNode.languageCode} AS terms, 
    content.displayType AS displayType, 
    content.savedAs AS savedAs, 
    content.webURL AS webURL, 
    content.embedSrc AS embedsrc, 
    content.UUID AS UUID
LIMIT 15