使用动态节点标签运行Cypher Query时出现语法错误

时间:2015-02-21 17:34:52

标签: neo4j cypher spring-data-neo4j

您好我正在尝试通过动态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。

2 个答案:

答案 0 :(得分:3)

您不能在Cypher中使用参数化标签。这样做的基本原理是,不同的标签可能会导致完整的单独查询计划。想想有标签的标签,没有索引的标签等。 Cypher缓存了参数化Cypher字符串的查询计划,因此不可能将标签作为参数。

对于标签和关系类型,您需要在客户端使用字符串连接。

答案 1 :(得分:0)

您不能通过参数动态设置标签,关系类型也是如此。

您可以改为使用字符串串联:

    @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

的链接