在不存在的模式中在Neo4j中创建标记?

时间:2016-05-18 20:06:21

标签: c# neo4j cypher

我刚刚开始使用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();
    }
}

1 个答案:

答案 0 :(得分:2)

确实在空的neo4j数据库上创建索引和唯一约束的工作正常,建议在插入数据之前使用它们。