赞
踩
UNWIND
批量创建关系假设你已经有了 100,000 个节点数据和它们之间的关系数据,可以使用 UNWIND
语句来批量创建节点和关系。
批量创建节点:
首先,使用 UNWIND
创建节点。
WITH [
{eGuid: 'guid1', eId: 'id1', layer: 'layer1'},
{eGuid: 'guid2', eId: 'id2', layer: 'layer2'},
...
{eGuid: 'guid100000', eId: 'id100000', layer: 'layer100000'}
] AS data
UNWIND data AS row
CREATE (n:Node {eGuid: row.eGuid, eId: row.eId, layer: row.layer})
RETURN count(n)
批量创建关系:
假设关系数据如下:
startGuid,endGuid,relationshipType
guid1,guid2,RELATED_TO
guid3,guid4,CONNECTED_TO
...
guid99999,guid100000,ASSOCIATED_WITH
将关系数据存储在一个列表中,并使用 UNWIND
创建关系:
WITH [
{startGuid: 'guid1', endGuid: 'guid2', relationshipType: 'RELATED_TO'},
{startGuid: 'guid3', endGuid: 'guid4', relationshipType: 'CONNECTED_TO'},
...
{startGuid: 'guid99999', endGuid: 'guid100000', relationshipType: 'ASSOCIATED_WITH'}
] AS relationships
UNWIND relationships AS rel
MATCH (startNode:Node {eGuid: rel.startGuid}), (endNode:Node {eGuid: rel.endGuid})
CREATE (startNode)-[r:RELATIONSHIP {type: rel.relationshipType}]->(endNode)
RETURN count(r)
C# 代码实现
List<Dictionary<string, object>> nodeData = new List<Dictionary<string, object>>{
new Dictionary<string, object>
{
{ "eGuid", guid },
{ "eId", id },
{ "layer", layer },
}
};
IResultCursor batchInsertNode = await session.RunAsync(
@"UNWIND $nodeData AS row
MERGE (n: PrimitiveNode { eGuid: row.eGuid, eId: row.eId, layer: row.layer})
RETURN count(n)",
new { nodeData });
List<Dictionary<string, object>> relationData = new List<Dictionary<string, object>>{
new Dictionary<string, object>
{
{ "startGuid", s_eGuid },
{ "endGuid", t_eGuid },
{ "relationName", relation },
}
};
IResultCursor batchInsertRelation = await session.RunAsync(
@"UNWIND $relationData AS rel
MATCH (startNode:PrimitiveNode {eGuid: rel.startGuid}), (endNode:PrimitiveNode {eGuid: rel.endGuid})
MERGE (startNode)-[r:PrimitiveRelation {name: rel.relationName}]->(endNode)",
new { relationData });
如果数据量很大,可以将数据存储在 CSV 文件中,然后使用 LOAD CSV
导入。
创建 CSV 文件:
创建两个 CSV 文件,一个用于节点数据,另一个用于关系数据。
nodes.csv:
eGuid,eId,layer
guid1,id1,layer1
guid2,id2,layer2
...
guid100000,id100000,layer100000
relationships.csv:
startGuid,endGuid,relationshipType
guid1,guid2,RELATED_TO
guid3,guid4,CONNECTED_TO
...
guid99999,guid100000,ASSOCIATED_WITH
加载 CSV 文件并创建节点:
LOAD CSV WITH HEADERS FROM 'file:///nodes.csv' AS row
CREATE (:Node {eGuid: row.eGuid, eId: row.eId, layer: row.layer})
RETURN count(*)
加载 CSV 文件并创建关系:
LOAD CSV WITH HEADERS FROM 'file:///relationships.csv' AS row
MATCH (startNode:Node {eGuid: row.startGuid}), (endNode:Node {eGuid: row.endGuid})
CREATE (startNode)-[r:RELATIONSHIP {type: row.relationshipType}]->(endNode)
RETURN count(r)
UNWIND
。要在单个属性上创建索引,可以使用以下命令:
CREATE INDEX index_name FOR (n:Label) ON (n.property)
例如:
CREATE INDEX person_name_index FOR (p:Person) ON (p.name)
要在多个属性上创建组合索引,可以使用以下命令:
CREATE INDEX index_name FOR (n:Label) ON (n.property1, n.property2)
例如:
CREATE INDEX person_name_dob_index FOR (p:Person) ON (p.name, p.dob)
Neo4j 还支持全文索引,可以用于全文搜索。要创建全文索引,可以使用以下命令:
CALL db.index.fulltext.createNodeIndex('index_name', ['Label'], ['property'])
例如:
CALL db.index.fulltext.createNodeIndex('person_name_index', ['Person'], ['name'])
要查看数据库中现有的所有索引,可以使用以下命令:
CALL db.indexes
要删除一个索引,可以使用以下命令:
DROP INDEX index_name
例如:
DROP INDEX person_name_index
删除所有关系:
MATCH ()-[r]-()
DELETE r
删除所有节点:
MATCH (n)
DELETE n
该命令尝试直接删除匹配到的节点
n
。如果节点n
还有任何连接的关系,这条命令会失败并报错,因为 Neo4j 不允许直接删除仍然连接着关系的节点。使用限制:只能删除没有任何关系的孤立节点。
删除所有节点:
MATCH (n)
DETACH DELETE n
该命令不仅删除匹配到的节点
n
,还会先删除与该节点连接的所有关系。这样就避免了直接删除节点时可能遇到的错误。使用优势:能够删除任何节点,无论它们是否连接着关系。
如果安装了 APOC 扩展,可以使用更简便的方法:
CALL apoc.periodic.iterate(
'MATCH (n) RETURN n',
'DETACH DELETE n',
{batchSize: 1000}
)
如果你使用的是 Neo4j 4.0 及以上版本,可以使用 dbms.clearDatabase()
命令重置数据库:
CALL dbms.clearDatabase()
如果你在本地开发环境中,可以通过删除数据库文件来清空所有数据。这需要停止 Neo4j 服务,删除数据库文件,然后重新启动服务。
停止 Neo4j 服务:
neo4j stop
删除数据库文件:
默认情况下,数据库文件位于 data/databases/
目录下。例如,对于默认数据库 neo4j
,删除相应文件:
rm -rf data/databases/neo4j
重新启动 Neo4j 服务:
neo4j start
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。