将Big xml文件导入嵌入Java的{neo4j

时间:2016-03-22 02:20:20

标签: java neo4j

我有一个非常大的XML文件,大约有50万行。

我正在尝试创建XML文件的Neo4j图形数据库。

我在NetBeans IDE中使用Java来:

1)在Java应用程序中导入XML数据 2)用数据创建一个Neo4j图数据库。

对于第1步,我使用的是SAX解析器,它一次为我提供一个xml标记的数据。

XML标记是:

1)会议论文。 (外部标签)
2)它所属的会议。 (内标)
3)会议论文的作者。 (内标)

创建Neo4j图形数据库时,我需要以下节点和关系。

1)为每篇论文创建一个新节点。 (由于每篇论文仅描述一次,因此不会出现重复)
2)为每个会议创建一个新节点。 (图中不应存在重复)
3)为每个作者创建一个新节点。 (图表中不应存在重复)

在关系中,每篇论文应与其会议相关联,每位作者应与作者撰写的论文相关联。

示例:

enter image description here

我知道这是一个非常具体的问题,但我不期待我的问题得到完美答案,我只是在寻找解决问题的方法。

我是Neo4j的新手。

我应该怎么解决这个问题?我被建议使用批量插入,但是可以在一次插入1个值(节点)时使用它,并在插入时检查图形数据库中的条件和约束。

这就是我的想法:
如果标签已经有一个节点(如果会议节点已经存在,请不要创建节点,只需按其ID查找节点并将纸张链接到该节点)或创建节点(如果该节点不存在)(创建一个节点)会议的新节点(如果不存在,然后将纸张链接到新节点)。纸和作者的过程相同。 (如果作者不存在,则创建一个新节点并将作者链接到论文,或者如果作者已经存在,则找到该节点并将该节点链接到该论文)。这个过程需要多长时间?采用这种方法是否可行。

我有什么其他方法可以解决这个问题?

非常感谢任何帮助。

提前多多感谢。

1 个答案:

答案 0 :(得分:2)

[增订]

我们假设您的数据具有论文,作者和会议的唯一ID。最小的neo4j数据模型可能看起来像这样(模仿你问题中说明的模型):

(:Conf {id: 111, name: 'XYZ Conference 2016'})-[:HAS_PAPER]->
  (:Paper {id: 222, name: 'The Theory of Everything'})-[:HAS_AUTHOR]->
  (:Author {id: 333, name: 'Albert Einstein IV'})

如果您的neo4j客户端在每篇论文中填写3 parameters这样的信息:

{
  "conf": {"id": "111", "name": "XYZ Conference 2016"},
  "authors": [
    {"id": "333", "name": "Albert Einstein IV"},
    {"id": "444", "name": "Isaac Newton XVIII"}],
  "paper": {"id": "222", "name": "The Theory of Everything"}
}

然后,为纸张创建节点和关系的查询看起来像这样:

MERGE (c:Conf {id: {conf}.id, name: {conf}.name} ) 
CREATE (c)-[:HAS_PAPER]->(p:Paper {paper})
FOREACH (x IN {authors} |
  MERGE (a:Author {id: x.id, name: x.name})
  CREATE (p)-[:HAS_AUTHOR]->(a))

注1:上述MERGE条款假设会议和作者姓名永远不会改变。如果它们可以更改,则name属性应设置在单独的SET子句中,或者您可以为同一ID获取多个节点。

注意2:当可以进行并发更新时,即使每个人都使用MERGE,也可以获得具有相同ID的重复节点。因此,为防止重复节点,您应为:Conf(id):Author(id):Paper(id)创建uniqueness constraints。 neo4j将中止违反此类约束的查询。

注3:MERGE子句不支持直接从" map"设置所有属性,如CREATE子句那样,所以MERGE子句有分别指定每个属性。