2015-11-14 26 views
3

Neo4j 2.3引入了在范围查找中使用模式标签索引的功能。在Cypher中使用此功能很简单,例如:Neo4j Java API - 模式索引范围查找?

MATCH (n:SomeLabel) WHERE n.prop > 200 AND n.prop < 300 

如预期的那样,查询将使用SomeLabel(prop)的索引。

我的问题是,有没有办法用标准的Neo4j Java API复制它?我可以使用GraphDatabaseService.findNodes来执行单个值模式索引查找,但我没有看到任何允许范围查询的方法。

我知道我可以使用Java API运行Cypher查询来完成此操作,但由于我的项目只使用低级Java API,因此如果可能,我想避免这种情况并保持一致。

回答

1

根据Neo4j's documentation,您无法找到使用属性范围的节点。

所以,做你想做的事,你可以具有所需标签的每个节点匹配,并检查Java方面的取值范围是什么:

假设gdb是你GraphDatabaseService,并Labels您的标签枚举:

ResourceIterator<Node> nodes = gdb.findNodes(Labels.SomeLabel); 
Set<Node> result = new HashSet<Node>(); 
while(nodes.hasNext()){ 
    Node n = nodes.next(); 
    // I cast only to ensure I really get an integer 
    int prop = Integer.valueOf(n.getProperty("prop").toString()); 
    if(prop > 200 && prop < 300){ 
     result.add(n); 
    } 
} 
//And here you can return your Set, or do whatever you want with it 
+0

感谢您的信息。这在我的情况下并不会很好,因为对于我的用例来说,重要的是索引被使用,而不是每个项目和属性都必须被获取和检查。 如果没有办法只用Java API来完成,那么我可能会像这样使用Cypher来正确利用模式索引进行范围查找: 结果myResult = graphDb.execute(“MATCH(n :SomeLabel)WHERE n.prop> 200 AND n.prop <300“) –

+1

所以我恐怕唯一的方法就是使用GraphDatabaseService中的'execute(String query)'方法...你不需要有任何方法来找到使用一个或多个范围的节点 – Supamiu

+0

是的,似乎是这样。不幸的是,现在范围查询可以利用模式索引。我希望他们决定添加一个方法。这将是有益的,恕我直言。 –