Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从collect返回对象(cypher/neo4j)_Neo4j_Cypher - Fatal编程技术网

从collect返回对象(cypher/neo4j)

从collect返回对象(cypher/neo4j),neo4j,cypher,Neo4j,Cypher,我正在尝试以用户指定的语言返回内容,如果在所选语言中找不到内容,则返回默认语言(英语)。似乎不支持从collect语句返回对象。有没有办法达到类似的效果呢 查询现在的状态: MATCH (meta:contentMeta)<-[metaLang:HAS_META]-(content:content)-[:TAGGED_WITH]-(termNode:term)-[lang:HAS_LANGUAGE]-(langNode:termMeta) WHERE metaLang.langu

我正在尝试以用户指定的语言返回内容,如果在所选语言中找不到内容,则返回默认语言(英语)。似乎不支持从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) AS terms.name, 
collect(langNode.languageCode) AS terms.languageCode

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

我不太清楚您的模型是如何工作的,但您可能可以通过映射和集合文字实现您想要的。对于您的第一个示例,您可以尝试

collect ( [langNode.name, langNode.languageCode] ) as terms
第二个例子

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


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

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

此外,目前尚不清楚您当前的布尔测试是否(始终)按预期工作,因为neo4j手册没有记录OR和and运算符之间的运算符优先级。因此,我简化了布尔测试,并使用“IN”操作符确保它们(始终)按预期工作

最后,我认为您不需要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
匹配(:contentMeta)
collect ( {name:langNode.name, languageCode:langNode.languageCode} ) as terms
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