Cypher 查询

在 Java 中,您可以按照以下示例使用 Cypher 查询语言

示例的源代码可在以下位置找到:JavaQuery.java

首先,您可以添加一些数据

DatabaseManagementService managementService = new DatabaseManagementServiceBuilder( databaseDirectory ).build();
GraphDatabaseService db = managementService.database( DEFAULT_DATABASE_NAME );

try ( Transaction tx = db.beginTx())
{
    Node myNode = tx.createNode();
    myNode.setProperty( "name", "my node" );
    tx.commit();
}

执行查询

try ( Transaction tx = db.beginTx();
      Result result = tx.execute( "MATCH (n {name: 'my node'}) RETURN n, n.name" ) )
{
    while ( result.hasNext() )
    {
        Map<String,Object> row = result.next();
        for ( Entry<String,Object> column : row.entrySet() )
        {
            rows += column.getKey() + ": " + column.getValue() + "; ";
        }
        rows += "\n";
    }
}

在此示例中,您还可以看到如何迭代 org.neo4j.graphdb.Result 的行。

代码将生成

n: Node[0]; n.name: my node;

使用 Result 对象时,您应该消费整个结果(通过使用 next() 迭代所有行,通过迭代 columnAs() 的迭代器或调用例如 resultAsString())。如果未能这样做,将无法正确清理 Result 对象使用的资源,导致意外行为,例如事务泄露。如果您不想迭代所有结果,请确保在完成后立即调用 close(),以释放与结果相关的资源。

处理结果的推荐方法是使用 try-with-resources 语句。这可确保在语句结束时关闭结果。

您还可以获取结果中的列列表

List<String> columns = result.columns();

这将为您提供

[n, n.name]

使用以下方法从单个列中获取结果项。在这种情况下,您必须从节点而不是从结果中读取属性

Iterator<Node> n_column = result.columnAs( "n" );
n_column.forEachRemaining( node -> nodeResult = node + ": " + node.getProperty( "name" ) );

在这种情况下,结果中只有一个节点

Node[0]: my node

仅当结果包含单个列或您只对结果的单个列感兴趣时才使用此方法。

resultAsString()writeAsStringTo()columnAs() 不能在同一个 Result 对象上多次调用,因为它们会消费结果。同样,每次调用 next() 都会消费部分结果。您应该只使用其中一个,如果需要在同一个查询结果上使用其他方法的功能,则应创建一个新的 Result 对象。

有关 Cypher 的 Java 接口的更多信息,请参阅 Neo4j Javadocs

有关 Cypher 的更多信息和示例,请参阅 Neo4j Cypher 手册

© . All rights reserved.