neo4j嵌入式java中的复杂查询

时间:2015-05-24 16:04:39

标签: neo4j neo4j-java-api

我如何执行

MATCH (p:Person:Actor)-[r:ACTED_IN]->(m:Movies{name:"ABC"}) RETURN p.name;

在neo4j嵌入式Java中。详细解释代码将有很大帮助。 注意:我想在原生Java api中执行此操作,而不是在cypher中执行此操作。它应该有大约100000个节点

2 个答案:

答案 0 :(得分:1)

您可以使用以下命令执行Cypher查询:

GraphDatabaseService db = ...;

// from version 2.2.x onwards
db.execute("your cypher statement");

// before version 2.2.x
ExecutionEngine engine = new ExecutionEngine(db)
engine.execute("your cypher statement");

如果您在v2.2之前使用Neo4j,请注意ExecutionEngine应该被实例化为单例,以便正确缓存执行计划。

如果您有强大的性能限制,可能希望使用TraversalDescription并自定义许多可用参数,并在需要时定义遍历回调。关键是要确保您根据需要遍历小节点。

你应该知道Cypher执行的性能越来越高,最后一个版本(2.2)带来了很多改进。

答案 1 :(得分:0)

您可以尝试这样的事情:

Label person = DynamicLabel.label("Person");
for(Node p : GlobalGraphOperations.at(gdb).getAllNodesWithLabel(person))
{
    RelationshipType actedIn =  DynamicRelationshipType.withName("ACTED_IN");
    if(p.hasRelationship(actedIn, Direction.OUTGOING))
    {
        Node m = p.getSingleRelationship(actedIn, Direction.OUTGOING).getEndNode();
        Label person = DynamicLabel.label("Movies");
        if(m.hasLabel(movies) && m.getProperty("name", null) == "ABC")
        {
            return p.getProperty("name");
        }
    }
}