Spring Data Neo4j 按标签查找节点

Spring Data Neo4j find nodes by label

我目前正在使用 SDN 4 并尝试执行以下查询:

@Query("MATCH (n:TNode:{0}) RETURN n")
Collection<TNode> getNodes(String type);

其中每个节点都有一个公共标签 "TNode" 和一个单独的标签 type。但是,它总是returns语法错误。我确定查询是正确的,因为它 returns 使用 Neo4j Web 客户端的节点。

是否因为SDN无法通过label找到节点而出现错误?

这是 Cypher 的限制,而不是 SDN。不支持将标签(或关系类型)作为参数。参见 this and related feature requests

您可以使用 where 子句和 labels(n) 函数解决此问题:

MATCH (n:TNode) 
WHERE {0} in labels(n) 
RETURN n

这有一个警告 - 它将遍历与 MATCH 子句匹配的所有节点。在您的情况下,使用 :TNode 标签可能会解决问题,但通常使用简单的 MATCH (n) 会遍历数据库中的所有节点,这会非常慢。

其他选项是手动构建查询并使用 org.springframework.data.neo4j.template.Neo4jOperations#queryForObjects 到 运行 查询:

String query = "MATCH (n:TNode:" + type + ") RETURN n"; // ugly, but works, beware of query injections etc..
Collection<TNode> nodes = neo4jOperations.queryForObjects(TNode.class, query, params);