Neo4j:无效输入'|';:应为空白、注释、关系模式

Neo4j:无效输入'|';:应为空白、注释、关系模式,neo4j,cypher,list-comprehension,Neo4j,Cypher,List Comprehension,以下请求 MATCH (n:artist) RETURN [(:tag { _id : 'jazz' })-[:TAGS]->(n) AND (:tag { _id : 'pop' })-[:TAGS]->(n) | n._id] AS ids 返回以下错误: Invalid input '|': expected whitespace, comment, a relationship pattern, '.', node labels, '[', "=~", IN, STAR

以下请求

MATCH (n:artist) 
RETURN  [(:tag { _id : 'jazz' })-[:TAGS]->(n) AND (:tag { _id : 'pop' })-[:TAGS]->(n) | n._id] AS ids
返回以下错误:

Invalid input '|': expected whitespace, comment, a relationship pattern, '.', node labels, '[', "=~", IN, STARTS, ENDS, CONTAINS, IS, '^', '*', '/', '%', '+', '-', '=', "<>", "!=", '<', '>', "<=", ">=", AND, XOR, OR, ',' or ']' (line 1, column 104 (offset: 103))

Neo4j版本:3.3.4

您不能将
放入模式表达式中;它必须放在
WHERE
子句中。不能在两种模式中间放置<代码>和<代码>。通常,您会将它们的约束转换为WHERE语法,并将它们放在该子句中;但是,对于您的特定情况,可以将查询重写为单个模式

试试这个:

MATCH (n:artist) 
RETURN  [(:tag { _id : 'jazz' })-[:TAGS]->(n)<-[:TAGS]-(:tag { _id : 'pop' }) | n._id] AS ids
最后,这个由@Tezra提出的解决方案检查给定列表中的每个标记是否被搜索。它可以更有效地处理您的查询;我建议对每种样式使用
PROFILE
,以找到最适合您的样式:

WITH ['jazz', 'pop', 'tag1', 'tag2', ...] AS tags MATCH (n:song) WHERE ALL(tag in tags WHERE (:tag {_id: tag})-[:TAGS]->(n)) RETURN n._id;

这将返回一个ID流。要将所有id放在作为一个值返回的单个列表中,请将上述语句的
RETURN
子句替换为
RETURN COLLECT(n._id)
(由@Emilien建议)。

从CSV文件加载数据时,我在Neo4j Cypher查询中遇到了类似的问题。在我的例子中,大约有20个节点属性。我收到了错误信息

无效输入“p”:应为空白、注释、节点标签、MapLiteral、参数、参数(旧语法)、“)”或关系模式(第2行第20列(偏移量:90))

查询语法是正确的

解决方案:只需点击回车按钮,即可将长查询移动到多行。
是的,它对我的案例有效。

您使用的是什么版本的Cypher(或Neo4j)?您列出的后面的查询有效,但仅适用于较新的Cypher版本。(我相信列表理解,即
|n.\u id
部分,是在版本3.1中添加的)而且错误看起来与使用旧版本Neo4j的地方相同,所以我首先检查了它=P@Tezra使用语法中的
的建议解决方案不会返回至少由一个标记标记的所有n.\u id吗?听起来OP只需要由所有给定术语标记的
n
s,而不仅仅是一个。虽然我比我更喜欢你简洁的解决方案。@Rebecca Nelson是的。。。这是一个OR查询。实际上,我建议使用
。。。其中所有(标签中的标签|(:标签{u id:tag})-[:标签]->(n))…
模式,因为这更容易阅读,对密码计划者也更友好。嗯,我觉得使用起来很愚蠢,似乎很自然,我甚至没有想到这是不允许的!我实际上需要链接
,所以这个查询对我不起作用。。。我试图找出一个可以工作的
,但我失败了…@Emilien没问题!您还可以在
WHERE
子句中放置模式;我将更新我的答案,以显示如何将其适配到多个(两个以上)标记。@Emilien很乐意提供帮助!请注意,我提出的解决方案可能会完成工作,但可能不是很有效。我强烈建议您看看Tezra在您的问题下的评论。最后一个性能说明,如果您经常检查动态列表,WHERE ALL/ANY/NONE(…)模式可以与查询参数一起使用,允许Cypher planner计划一次,并执行多次。动态和链接防止Cypher重复使用以前的计划。@Rebecca,la解决方案不会返回列表,我建议您添加
collect(n.。\u id)
,以便它真正回答以下问题:)
MATCH (n:artist) 
RETURN  [(:tag { _id : 'jazz' })-[:TAGS]->(n)<-[:TAGS]-(:tag { _id : 'pop' }) WHERE (:tag { _id : 'mytag1' })-[:TAGS]->(n) AND (:tag { _id : 'mytag1' })-[:TAGS]->(n) AND ... | n._id] AS ids
WITH ['jazz', 'pop', 'tag1', 'tag2', ...] AS tags MATCH (n:song) WHERE ALL(tag in tags WHERE (:tag {_id: tag})-[:TAGS]->(n)) RETURN n._id;