Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

returning an object from collect (cypher/neo4j)

Tags:

neo4j

cypher

I'm trying to return content in the language specified by the user, or the default language (english) if the content is not found in the selected language. It seems like returning an object from a collect statement is not supported. Is there a way to achieve a similar result though?

The query as it is now:

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

The problem is what I really want returned is an object with the name of the node as well as the language code. Something like:

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

or this:

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

Of course, this syntax does not work. Are there any simple solutions to this?

like image 854
bornytm Avatar asked Dec 10 '25 09:12

bornytm


1 Answers

Not sure I understand exactly how your model works, but you could probably achieve what you want with map and collection literals. For your first example you could experiment with

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

and second example

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

or

collect ( {name:langNode.name, languageCode:langNode.languageCode} ) as terms
like image 80
jjaderberg Avatar answered Dec 13 '25 09:12

jjaderberg