Neo4J的BatchInserter中的唯一性

时间:2014-02-03 15:27:01

标签: neo4j

我正在使用“BatchInserter”来构建图形(在单个线程中)。我想确保节点(以及可能的关系)是唯一的。我目前的解决方案是以下列方式检查节点是否存在:

    String name = (String) nodeProperties.get(IndexKeys.CATEGORY_KEY);

if(index.get(IndexKeys.CATEGORY_KEY, name).size() > 0) 
        return index.get(IndexKeys.CATEGORY_KEY, name).getSingle();

    Long nodeID = inserter.createNode( nodeProperties,categoryLabel ); 

    index.add(nodeID, nodeProperties);   

    index.flush();

它似乎工作正常,但你可以看到它是IO昂贵的(冲洗每一个新的添加 - 我相信是一个lucene“提交”命令)。这大大减慢了我的代码速度。

我知道put if absentuniqueFactory。记录在案:

  

通过使用put-if-absent功能,可以使用索引保证实体唯一性。   这里索引充当锁,只锁定最小的部分   需要保证线程和事务的唯一性。至   获得更高级别的get-or-create功能   UniqueFactory

但是,这些是与图表进行基于交易的交互。我想要做的是确保节点的唯一性以及批量插入语义中可能的关系,这比我当前的设置更快。

任何指针都会非常感激。

谢谢

2 个答案:

答案 0 :(得分:0)

您应该调查cypher中的MERGE关键字。我相信这将允许您利用自动索引,而无需您自己使用它们。更广泛地说,您可能希望了解是否可以通过neo4j-shell以有助于管理大量密码查询的方式来制定批量加载。

最后,作为一般指针和背景,您应该查看this information on bulk loading

答案 1 :(得分:-1)

当我遇到这个问题时,我只是决定去暴君并强制我自己的索引值。你不能这样做吗?我的意思是,在进行插入之前确保唯一性?