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 " );
现在您拥有如下所示的图
打印结果
创建图后,您可以读取并打印结果。
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();
|
在事务提交时删除仍拥有关系的节点将导致失败。这是为了确保关系始终拥有起始节点和结束节点。 |