Spring Data Neo4j按标签查找节点

时间:2016-05-10 04:08:03

标签: spring-data-neo4j

我目前正在使用SDN 4和trys执行以下查询:

message1

其中每个节点都有一个公共标签d3.json("india-states.json", function (json) { india.selectAll("path") .data(json.features) .enter().append("path") .attr("d", path); var stateText = india.selectAll(".text") .data(json.features) .enter() .append("text"); var arrayStates = [];//this array will hold all the names var socket = io(); socket.on('tags', function(data){ arrayStates.push(data.message1);//for each input, a new string stateText.attr("fill", "black") .attr("transform", function(d) { var centroid = path.centroid(d); return "translate(" + centroid[0] + "," + centroid[1] + ")" }) .attr("text-anchor", "middle") .attr("dy", ".35em") .style('fill', 'white') .text(function(d) { for(var i = 0; i < arrayStates.length; i++){ if (d.id == arrayStates[i]) { return arrayStates[i]; } } }); }); }); 和一个单独的标签@Query("MATCH (n:TNode:{0}) RETURN n") Collection<TNode> getNodes(String type); 。但是,它总是返回语法错误。我确定查询是正确的,因为它使用Neo4j Web客户端返回节点。

是否发生错误是因为SDN无法通过"TNode"找到节点?

1 个答案:

答案 0 :(得分:3)

这是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);