Neo4j:无效输入'|':预期的空格,注释,关系模式

时间:2018-04-13 17:39:14

标签: neo4j cypher list-comprehension

以下请求

WHERE Name='Name'

返回以下错误:

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

我完全不知道什么是错的,似乎问题在于“AND”,因为这个查询工作正常:

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

2 个答案:

答案 0 :(得分:2)

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

试试这个:

MATCH (n:artist) 
RETURN  [(:tag { _id : 'jazz' })-[:TAGS]->(n)<-[:TAGS]-(:tag { _id : 'pop' }) | n._id] AS ids

如果您需要搜索多个标签,可以在列表推导中的主模式之后直接在WHERE子句中添加其他标签:

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

最后,@ 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建议)。

答案 1 :(得分:0)

从CSV文件加载数据时,我在Neo4j Cypher Query中遇到了类似的问题。就我而言,大约有20个节点属性。我收到错误消息

“无效的输入'P':预期的空格,注释,NodeLabel,MapLiteral,参数,参数(旧语法),')'或关系模式(第2行,第20列(偏移量:90))“ / p>

查询语法正确。

解决方案:只需按Enter键,就可以将长查询移到多行。 是的,它适合我的情况。