我正在使用BatchInserter来初始化我的Neo4j数据库 - 数据来自我本地文件系统上的XML文件。
假设一组文件包含节点信息/属性,另一组文件包含关系信息。我想做两次传递:创建所有节点,然后设置创建关系。
但是,createRelationship方法接受节点的长id,我在关系XML中没有这个ID - 我的所有节点都有一个GUID作为一个名为ID的属性,我用它来引用它们。
BatchInsert是否意味着它尚未编入索引,因此我将无法根据其他属性在节点上创建关系?
答案 0 :(得分:1)
我通常只是将节点属性保存在内存缓存中的id映射中,就像Trove那样有效的集合实现。
然后,对于关系,您可以按属性查找node-id。
答案 1 :(得分:0)
我发现我可以随时向索引添加节点。
创建索引:
BatchInserter inserter = BatchInserters.inserter( "data/folder" );
BatchInserterIndexProvider indexProvider = new LuceneBatchInserterIndexProvider( inserter );
BatchInserterIndex index = indexProvider.nodeIndex("myindex", MapUtil.stringMap( "type", "exact" ) );
然后每次插入节点时,也将它添加到索引中:
Label label = DynamicLabel.label("person");
Map<String, Object> properties = new HashMap<>();
properties.put("ID", <some-value-here>);
long newNode = inserter.createNode(properties, labek);
index.add(newNode, properties);
index.flush();
我可以随意查询:
IndexHits<Long> hits = index.get("ID", <some-value-here>);
if(hits.size() > 0) {
long existing = hits.getSingle();
}
我不知道这是否有用。我想在索引上调用flush通常是一个坏主意,但它似乎对我有用。