2014-04-28 68 views
7

我想在Neo4j中构建一个包含七种不同类型的节点的结构,共约4-5000个节点,并且它们之间有40000个关系。我目前使用的密码是我首先用代码创建节点:在neo4j中同时创建节点和关系

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中的一切都有依赖性。我也involed HW相关性,如可能的硬件上运行这些功能,使用暗号代码等设备上,以便basicaly IM版本,例如:

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表è所有这些信息tc,我这样做了代码,以为我可以把它放在一个大规模密码查询中,并在本地主机上的/浏览器上运行它。只要我一次不使用超过4-5000个查询,它就非常好用。然后它最多在5-10秒内创建完整的数据库,但现在当我试图在同一时间运行45000个查询时,它已经运行了将近24小时,并且仍在加载并且正在执行查询。 ..“。我想知道是否可以改进所需的时间,数据库最终是否会创建?或者我可以做一些更聪明的索引或其他东西来改善性能?因为顺便说一句,我的密码是现在写的,我不能将它分成几部分,因为数据库中的所有内容都与产品有某种连接。我是否需要重写代码或者是否有任何顺畅的方法?

回答

11

您可以创建一个单个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); 

当然你可以有多个match子句和多个创建条款存在。

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

您尚未指定您正在运行的不是“停止加载”的查询。更新你的问题的具体细节,让我们知道你已经尝试过,也许可以帮助。

+0

谢谢!这应该被接受为答案 – troig

+0

我们不需要括号吗? (a) - [:BLAH] - >(b) – orestiss

+0

是的。答案是在2014年写的,当你不需要它们的时候。 – FrobberOfBits

0

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

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

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

+0

这看起来像是一件非常有趣的事情,我唯一的问题是如果我可以使用例如特征和特征之间的关系,并且它们之间具有不同种类的关系,因为在这个数据库中有相同类型的节点可能具有十种不同的关系到同一类型的节点。所以我不能使用: CREATE(p) - [:PLAYED {role:csvLine.role}] - >(m)' 或者我能否在我的时间运行一些数据库?因为这可能是我目前的问题,所以我不能把它分成小块。 – ErikOstergren

+0

关系类型,标签和属性名称必须在查询中逐字指定 - 关系类型不能来自CSV文件。相反,您通常会使用一个CSV文件和每种类型的一个查询。 – Andres