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 手册