2016-03-22 66 views
1

我有一个大约50米行的非常大的XML文件。将大xml文件导入嵌入到Java中的neo4j

我想创建一个XML文件的Neo4j图形数据库。

我使用Java在NetBeans IDE到:在Java应用程序

1)导入XML数据。
2)用数据创建一个Neo4j图形数据库。

对于第1步,我使用SAX解析器,该解析器一次给我一个xml标签的数据。

XML标签为:

1)会议文件。 (外标签)
2)它属于的会议。 (内标)
3)会议论文的作者。 (Inner tag)

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

1)为每个纸张创建一个新节点。 (重复不会发生,因为每张纸只描述一次)
2)为每个会议创建一个新节点。 (图中没有重复项)
3)为每个作者创建一个新节点。 (图中不存在重复项)

在关系中,每篇论文都应该连接到其会议中,并且每个作者都应该连接到作者写的论文。

例子:

enter image description here

我知道这是一个非常具体的问题,但我不期待一个完美的答案,我的问题,我只是在寻找致力于解决它的办法。

我对Neo4j完全陌生。

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

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

我有什么其他选择来解决这个问题?

任何帮助将不胜感激。

非常感谢。

回答

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 CLA使用假定会议和作者姓名从不改变。如果它们可以更改,那么name属性应该设置在单独的SET子句中,或者可以为同一个ID获取多个节点。注2:当并发更新成为可能时,即使每个人都使用MERGE,也可以获得具有相同ID的重复节点。因此,为防止出现重复节点,您应该为:Conf(id),:Author(id):Paper(id)创建uniqueness constraints。 neo4j将放弃违反这种约束的查询。

注意3:MERGE子句不支持直接从“映射”设置所有属性,因为CREATE子句的作用,因此MERGE子句必须分别指定每个属性。

+0

你应该也有约束:Conf(id),:Author(id)和:Paper(id) –

+0

谢谢。我已经更新了我的答案。 – cybersam

+0

谢谢了很多答案@cybersam 在我问这个问题的时间和答案之间,我做了这样的事情,我在这个节点上创建了独特的约束,然后使用MERGE将数据插入到Graph和MATCH来获取哪个论文属于哪个作者,哪个论文属于哪个论文。 我认为它与您的建议类似,但我的代码要完成4天的估计时间。 是否有任何其他方法(如批插入),我可以使用它来为我的代码运行更快一点。 –