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