我正在使用“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 absent和uniqueFactory。记录在案:
通过使用put-if-absent功能,可以使用索引保证实体唯一性。 这里索引充当锁,只锁定最小的部分 需要保证线程和事务的唯一性。至 获得更高级别的get-or-create功能 UniqueFactory
但是,这些是与图表进行基于交易的交互。我想要做的是确保节点的唯一性以及批量插入语义中可能的关系,这比我当前的设置更快。
任何指针都会非常感激。
谢谢
答案 0 :(得分:0)
您应该调查cypher中的MERGE关键字。我相信这将允许您利用自动索引,而无需您自己使用它们。更广泛地说,您可能希望了解是否可以通过neo4j-shell以有助于管理大量密码查询的方式来制定批量加载。
最后,作为一般指针和背景,您应该查看this information on bulk loading
答案 1 :(得分:-1)
当我遇到这个问题时,我只是决定去暴君并强制我自己的索引值。你不能这样做吗?我的意思是,在进行插入之前确保唯一性?