【问题标题】:Complex queries in neo4j embedded javaNeo4j 嵌入式 Java 中的复杂查询
【发布时间】:2015-05-24 16:04:38
【问题描述】:

我该怎么做

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

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

【问题讨论】:

    标签: neo4j neo4j-java-api


    【解决方案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) 带来了很多改进。

    【讨论】:

    • 好吧,这里没什么难猜的。 2.2 版本带来了很多关于 Cypher 优化的改进。
    • 编辑了我的初始答案,为您提供替代方案,即 TraversalDescription。
    • 官方文档说使用 dB.execute() 是不是 ExecutionEngine 已弃用,其中 dB 是 GraphDatabaseService 的实例。
    • 啊,真的,这已在 2.2.x afaik 中引入。将适当地编辑我的答案。
    【解决方案2】:

    你可以试试这样的:

    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");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      相关资源
      最近更新 更多