Hello world

Neo4j 图由以下组成:

  • 节点

  • 连接节点的关系

  • 节点和关系上的属性

所有关系都有类型。例如,如果图表示社交网络,关系类型可以是 KNOWS。如果一种 KNOWS 类型的关系连接两个节点,通常表示这两个人彼此认识。图的大部分语义由应用程序的关系类型编码。虽然关系是有向的,但在遍历时不区分方向,任意方向均可遍历。

有关项目设置的信息,请参阅 在 Java 应用程序中嵌入 Neo4j

此示例的源代码位于:EmbeddedNeo4j.java

准备数据库

可以使用 enum 创建关系类型。在本例中,只需要一种关系类型。以下是定义方式

private enum RelTypes implements RelationshipType
{
    KNOWS
}

您还可以准备一些变量以供使用

GraphDatabaseService graphDb;
Node firstNode;
Node secondNode;
Relationship relationship;
private DatabaseManagementService managementService;

下一步是启动数据库服务器。请注意,如果为数据库指定的目录尚不存在,系统会自动创建它。

managementService = new DatabaseManagementServiceBuilder( databaseDirectory ).build();
graphDb = managementService.database( DEFAULT_DATABASE_NAME );
registerShutdownHook( managementService );

启动数据库服务器是一项开销较大的操作,因此不要在每次需要与数据库交互时都启动新实例。该实例可以被多个线程共享,事务则限于线程内部。

如前所述,您可以注册关闭钩子,确保 JVM 退出时数据库被关闭。

private static void registerShutdownHook( final DatabaseManagementService managementService )
{
    // Registers a shutdown hook for the Neo4j instance so that it
    // shuts down nicely when the VM exits (even if you "Ctrl-C" the
    // running application).
    Runtime.getRuntime().addShutdownHook( new Thread()
    {
        @Override
        public void run()
        {
            managementService.shutdown();
        }
    } );
}

接下来是与数据库交互。

在事务中包装操作

所有操作必须在事务中执行。这是刻意的设计决定,因为事务划分是使用真实企业级数据库的重要环节。下面的示例演示了 Neo4j 中的事务处理。

try ( Transaction tx = graphDb.beginTx() )
{
    // Database operations go here
    tx.commit();
}

欲了解更多关于事务的信息,请参阅 事务管理Neo4j Javadocs 中的 org.neo4j.graphdb.Transaction

为简洁起见,手册中未在每处都明确说明在事务中包装操作。

创建小型图

现在可以创建一些节点。以下示例展示如何创建一个由两个节点、一个关系以及若干属性组成的小型图。

firstNode = tx.createNode();
firstNode.setProperty( "message", "Hello, " );
secondNode = tx.createNode();
secondNode.setProperty( "message", "World!" );

relationship = firstNode.createRelationshipTo( secondNode, RelTypes.KNOWS );
relationship.setProperty( "message", "brave Neo4j " );

现在您拥有如下所示的图

hello world graph java

打印结果

创建图后,您可以读取并打印结果。

System.out.print( firstNode.getProperty( "message" ) );
System.out.print( relationship.getProperty( "message" ) );
System.out.print( secondNode.getProperty( "message" ) );

其输出为

Hello, brave Neo4j World!

欲了解如何在 Neo4j Browser 中查看图形,请参阅 浏览器手册 → 专用 Web 服务器

删除数据

在本例中,数据在提交前已被删除

// let's remove the data
firstNode = tx.getNodeById( firstNode.getId() );
secondNode = tx.getNodeById( secondNode.getId() );
firstNode.getSingleRelationship( RelTypes.KNOWS, Direction.OUTGOING ).delete();
firstNode.delete();
secondNode.delete();

在事务提交时删除仍拥有关系的节点将导致失败。这是为了确保关系始终拥有起始节点和结束节点。

关闭数据库服务器

最后,在应用程序结束时 关闭数据库服务器:

managementService.shutdown();