我正在尝试以用户指定的语言返回内容,或者如果找不到所选语言的内容,则返回默认语言(英语)。似乎不支持从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
当然,这种语法不起作用。有没有简单的解决方案?
答案 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