在neo4j中同时创建节点和关系

时间:2014-04-28 09:02:53

标签: neo4j cypher

我正在尝试在Neo4j中构建一个数据库,其结构包含七种不同类型的节点,总共约4-5000个节点,以及它们之间约40000个关系。我目前使用的密码是我首先使用代码创建节点:

Create (node1:type {name:'example1', type:'example2'})

该示例中约有4000个具有唯一节点。

然后,我已经说明了这样的关系:

Create
(node1)-[:r]-(node51),
(node2)-[:r]-(node5),
(node3)-[:r]-(node2);

大约有40000个这样独特的关系。

使用较小比例的图表,这根本不是任何问题。但是使用这个,执行查询永远不会停止加载。

有关如何使此类查询有效的任何建议?或者我应该做什么呢?

修改。我试图构建的是一个产品的大图,它的版本,发布版本,功能等与构建电影图形示例的方式相同。

该产品共有约6个版本,每个版本大约有20个版本。总共有371个功能,其中371个功能还有438个功能。每次释放转换(总共120个)然后大约有2-300个特征转换。这些Featureversions映射到其功能,该功能依赖于db中的所有内容。我还调用了HW依赖项,例如可能的hw来运行这些功能,发布等等。所以基本上我使用cypher代码,如:

Create (Product1:Product {name:'ABC', type:'Product'})
Create (Release1:Release {name:'12A', type:'Release'})
Create (Release2:Release {name:'13A, type:'release'})
Create (ReleaseVersion1:ReleaseVersion {name:'12.0.1, type:'ReleaseVersion'})
Create (ReleaseVersion2:ReleaseVersion {name:'12.0.2, type:'ReleaseVersion'})    

以及那些我使用

构建它们的人
Create (Product1)<-[:Is_Version_Of]-(Release1),
(Product1)<-[:Is_Version_Of]-(Release2),
(Release2)<-[:Is_Version_Of]-(ReleaseVersion21),        

一直到功能,然后我还添加了它们之间的依赖关系,如:

(Feature1)-[:Requires]->(Feature239),
(Feature239)-[:Requires]->(Feature51);       

由于我必须从许多不同的excel-sheets等中找到所有这些信息,我以这种方式编写代码,以为我可以将它放在一个大规模密码查询中并在localhost上的/ browser上运行它。只要我一次不使用超过4-5000个查询,它就能很好地工作。然后它最多在大约5-10秒内创建了整个数据库,但是现在当我尝试运行大约45000个查询时,它已经运行了将近24小时,并且仍在加载并说&# 34;执行查询...&#34;。我想知道无论如何我可以改善所需的时间,最终是否会创建数据库?或者我可以做一些更智能的索引或其他东西来改善性能?因为现在我的密码被编写的方式我不能把它分成几块,因为数据库中的所有东西都与产品有某种联系。我需要重写代码还是有任何顺畅的方法?

4 个答案:

答案 0 :(得分:16)

您可以创建与单个create语句相互链接的多个节点和关系,如下所示:

create (a { name: "foo" })-[:HELLO]->(b {name : "bar"}),
       (c {name: "Baz"})-[:GOODBYE]->(d {name:"Quux"});

这是一种方法,而不是使用单个语句单独创建每个节点,然后使用单个语句创建每个节点。

您还可以先通过匹配创建多个关系,然后创建:

match (a {name: "foo"}), (d {name:"Quux"}) create (a)-[:BLAH]->(d);

当然你可以有多个匹配子句,并且有多个创建子句。

您可能尝试匹配给定类型的节点,然后从该类型的节点创建所有必要的关系。你有足够的关系,这将需要很多查询。确保您已将用于匹配节点的属性编入索引。随着您的数据库变得越来越大,允许快速查找您尝试创建新关系的内容非常重要。

您还没有指定您正在运行哪个查询并且不会停止加载&#34;。更新您的具体细节问题,并告诉我们您尝试过的问题,也许可以提供帮助。

答案 1 :(得分:0)

另一种有趣的方法可能是直接在Excel中生成语句,有关示例,请参阅http://blog.bruggen.com/2013/05/reloading-my-beergraph-using-in-graph.html?view=sidebar。你可以在一个事务中运行很多CREATE语句,所以这不应该过于复杂。

答案 2 :(得分:0)

如果您能够使用Neo4j 2.1预发布里程碑,那么您应该尝试使用新的LOAD CSVPERIODIC COMMIT功能。它们专为这种用例而设计。

LOAD CSV允许您使用一个或多个Cypher模式描述数据结构,同时提供CSV值以避免重复。

PERIODIC COMMIT可以帮助提高大型导入的可靠性,并通过减少所需的内存量来提高性能。

答案 3 :(得分:0)

如果您已经创建了一个节点,那么一种简单的方法将是:

MATCH (n: user {uid: "1"}) CREATE (n) -[r: posted]-> (p: post {pid: "42", title: "Good Night", msg: "Have a nice and peaceful sleep.", author: n.uid});

此处用户节点已经存在,并且您已经创建了新关系和新的发布节点。