Neo4j BatchInserter - 使用Node属性创建关系

时间:2015-07-17 14:27:21

标签: neo4j

我正在使用BatchInserter来初始化我的Neo4j数据库 - 数据来自我本地文件系统上的XML文件。

假设一组文件包含节点信息/属性,另一组文件包含关系信息。我想做两次传递:创建所有节点,然后设置创建关系。

但是,createRelationship方法接受节点的长id,我在关系XML中没有这个ID - 我的所有节点都有一个GUID作为一个名为ID的属性,我用它来引用它们。

BatchInsert是否意味着它尚未编入索引,因此我将无法根据其他属性在节点上创建关系?

2 个答案:

答案 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通常是一个坏主意,但它似乎对我有用。