以下请求
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
答案 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键,就可以将长查询移到多行。 是的,它适合我的情况。