2015-11-14 27 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

是的,似乎是這樣。不幸的是,現在範圍查詢可以利用模式索引。我希望他們決定添加一個方法。這將是有益的,恕我直言。 –