你好,我正在尝试通过动态Cypher查询获取数据。。然而,有一个例外,比如:
org.neo4j.rest.graphdb.query.CypherTransactionExecutionException: Error executing cypher statements [{code=Neo.ClientError.Statement.InvalidSyntax, message=Invalid input '{': expected whitespace or a label name (line 1, column 54)
"MATCH (parentNode:ParentEntity)-[:HAS_A]->(childNode:{dynamicChildEntityType})= WHERE id(parentNode)={parentNodeId} RETURN childNode order by childNode.orderNr"
^}]
尝试调用方法时:
@Override
public List<ChildEntity> getChildrenOf(Long parentNodeId, String dynamicChildEntityType) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("dynamicChildEntityType", dynamicChildEntityType);
params.put("parentNodeId", parentNodeId);
String cql = "MATCH (parentNode:ParentEntity)-[:HAS_A]->(childNode:{dynamicChildEntityType})= WHERE id(parentNode)={parentNodeId} RETURN childNode order by childNode.orderNr";
return parentRepository.query(cql, params).as(List.class);
}
你能看到出了什么问题吗?我不能为标签使用参数吗?如果是,你有什么建议?
提前谢谢。
注意:我使用的是Neo4j v2.1.6版本,而不是Rest Api版本。
您不能在Cypher中使用参数化标签。这样做的基本原理是,不同的标签可能会产生一个完全独立的查询计划。想想有索引的标签,其他没有索引的标签等等。Cypher缓存参数化Cypher字符串的查询计划,因此不可能将标签作为参数。
对于标签和关系类型,您需要在客户端使用字符串串联。
不能通过参数动态设置标签,关系类型也是如此。
您可以使用字符串串联:
@Override
public List<ChildEntity> getChildrenOf(Long parentNodeId, String dynamicChildEntityType) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("dynamicChildEntityType", dynamicChildEntityType);
params.put("parentNodeId", parentNodeId);
String cql = "MATCH (parentNode:ParentEntity)-[:HAS_A]->(childNode:"+dynamicChildEntityType+"})= WHERE id(parentNode)={parentNodeId} RETURN childNode order by childNode.orderNr";
return parentRepository.query(cql, params).as(List.class);
}
另一种方法是使用APOC库中的addLabels过程:
它的工作原理就像这个
CALL apoc.create.addLabels(n, {dynamicChildEntityType}) YIELD node
这是APOC NEO4J APOC 的链接