Hello world
Neo4j 图由以下部分组成
-
节点
-
连接节点的关联
-
节点和关联上的属性
所有关联都有一个类型。例如,如果图表示一个社交网络,关联类型可以是 KNOWS
。如果类型为 KNOWS
的关联连接两个节点,则很可能表示两个人彼此认识。图的许多语义都编码在应用程序的关联类型中。虽然关联是有方向的,但无论方向如何,它们都同样可以被遍历。
有关项目设置的信息,请参阅将 Neo4j 嵌入到您的 Java 应用程序中。
此示例的源代码位于: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();
}
有关事务的更多信息,请参阅事务管理以及org.neo4j.graphdb.Transaction
的 Neo4j Javadoc。
为简洁起见,本手册中不再详细说明将操作封装在事务中。 |
创建小型图
现在您可以创建一些节点了。以下是创建由两个节点、一个关联和一些属性组成的小型图的方法
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 浏览器中查看图的更多信息,请参阅浏览器手册 → 专用 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();
在事务提交时删除仍有关联的节点将失败。这是为了确保关联始终具有起始节点和结束节点。 |