我刚刚开始使用Neo4j。基本上我只是使用neo4jclient连接到Neo4j,存储数百万个POCO对象。一切似乎都很好。几乎。
当使用相同标签插入多个100.000个节点时,合并一个唯一属性,性能会显着下降。因此,我考虑创建一个索引。如果没有索引,我会在HTTP层中遇到超时,但是使用索引一切正常。也就是说,我看到了诸如"连接关闭等异常情况。 Neo4j占用了100%的可用CPU。
真正的问题是: - 在存储任何内容之前,如何在空白数据库中预先创建索引?我是否必须定义架构,我该如何做?我知道我可以使用例如创建索引"创建指数:人(姓名)"。如果数据库中没有任何Person节点,那会起作用吗?我已经尝试了,但是当我检查:schema
时,没有定义任何索引。
我已查看online resources但无法找到答案。
更新:我已使用以下代码成功创建了标记(在空数据库中)。基本上我有一个抽象基类定义TypeName
属性(用作Label
)和KeyPropertyName
(用于合并)。
private void CreateIndices()
{
var exporters = typeof(NodeBase)
.Assembly.GetTypes()
.Where(t => t.IsSubclassOf(typeof(NodeBase)) && !t.IsAbstract)
.Select(t => (NodeBase) Activator.CreateInstance(t));
foreach (var exporter in exporters)
{
this.client.Cypher.Create(string.Format("CONSTRAINT ON (n:{0}) ASSERT n.{1} IS UNIQUE", exporter.TypeName, exporter.KeyPropertyName)).ExecuteWithoutResults();
}
}
答案 0 :(得分:2)
确实在空的neo4j数据库上创建索引和唯一约束的工作正常,建议在插入数据之前使用它们。