Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j Java API-模式索引范围查找?_Java_Neo4j - Fatal编程技术网

Neo4j Java API-模式索引范围查找?

Neo4j Java API-模式索引范围查找?,java,neo4j,Java,Neo4j,Neo4j 2.3引入了在范围查找中使用模式标签索引的功能。在Cypher中,使用此功能很简单,例如: MATCH (n:SomeLabel) WHERE n.prop > 200 AND n.prop < 300 匹配(n:SomeLabel),其中n.prop>200和n.prop200和道具200和n.prop

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

MATCH (n:SomeLabel) WHERE n.prop > 200 AND n.prop < 300
匹配(n:SomeLabel),其中n.prop>200和n.prop<300
正如所料,查询将使用SomeLabel(prop)的索引

我的问题是,有没有一种方法可以用标准的NEO4JJavaAPI来复制这种情况?我可以使用GraphDatabaseService.findNodes执行单值模式索引查找,但我没有看到任何允许范围查询的方法

我意识到我可以使用Java API运行密码查询来完成这一点,但由于我的项目只使用低级Java API,因此我希望避免这种情况,并尽可能保持一致。

根据您的说法,无法找到使用属性范围的节点

因此,要做您想做的事情,您可以匹配具有所需标签的每个节点,并检查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
ResourceIterator节点=gdb.findNodes(Labels.SomeLabel);
Set result=new HashSet();
while(nodes.hasNext()){
Node n=nodes.next();
//我强制转换只是为了确保我真的得到一个整数
int prop=Integer.valueOf(n.getProperty(“prop”).toString());
如果(道具>200和道具<300){
结果:添加(n);
}
}
//在这里,你可以归还你的电视机,或者用它做任何你想做的事情

谢谢您提供的信息。在我的案例中使用这一点并不是很好,因为对于我的用例来说,使用索引是很重要的,而不是必须获取和检查每一项和属性。如果没有办法只用Java API来实现,那么我可能只使用这样的Cypher,它将正确地利用模式索引进行范围查找:Result myResult=graphDb.execute(“MATCH(n:SomeLabel),其中n.prop>200和n.prop<300”),所以恐怕唯一的方法就是使用
execute(String query)
GraphDatabaseService中的方法。。。您没有任何使用范围或值查找节点的方法EAH,似乎就是这样。但不幸的是,现在范围查询可以利用模式索引。我希望他们决定增加一种方法。这会很有用的,IMHO。使用我提供的方法不会耗费资源,你知道,你只需要对数据库进行一次“查询”。因此,如果他们添加了一个这样做的方法,它可能会是几乎相同的实现。据我所知,这是非常昂贵的。findNodes只是做一个完整的标签扫描,这意味着该方法必须分析标签为“SomeLabel”的每个节点。因此,对于我的问题所基于的用例,对于每次查找,它必须分析大约100万个节点及其属性,以得到它所需要的100个左右。通过索引查找,它能够完全跳过这一点,并分析更少的节点。