首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在neo4j中同时创建节点和关系

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

Stack Overflow用户
提问于 2014-04-28 17:02:53
回答 4查看 21.5K关注 0票数 14

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

代码语言:javascript
复制
Create (node1:type {name:'example1', type:'example2'})

这个例子中大约有4000个节点是唯一的。

然后我有了这样的关系:

代码语言:javascript
复制
Create
(node1)-[:r]-(node51),
(node2)-[:r]-(node5),
(node3)-[:r]-(node2);

大约40000的这种独特的关系。

对于规模较小的图形,这根本不是什么问题。但是对于这个查询,执行的查询永远不会停止加载。

关于如何使这种类型的查询工作,有什么建议吗?或者我应该怎么做?

编辑。我试图构建的是一个产品上的大图,包括它的版本、发布版本、功能等,其方式与构建电影图示例的方式相同。

该产品总共有大约6个版本,每个版本大约有20个版本。总共有371个特性,其中有371个特性,还有438个特性版本。每次发布版本(总共120个)时,每个版本都有大约2-300个功能版本。这些功能版本被映射到它的功能,这些功能对数据库中的所有东西都有一点依赖。我还涉及到硬件依赖关系,例如运行这些功能的可能硬件,发布版本等,因此基本上使用密码进行即时通信,例如:

代码语言:javascript
复制
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'})    

下面是我用来组织它们的

代码语言:javascript
复制
Create (Product1)<-[:Is_Version_Of]-(Release1),
(Product1)<-[:Is_Version_Of]-(Release2),
(Release2)<-[:Is_Version_Of]-(ReleaseVersion21),        

一直到特性,然后我还在它们之间添加了依赖关系,例如:

代码语言:javascript
复制
(Feature1)-[:Requires]->(Feature239),
(Feature239)-[:Requires]->(Feature51);       

由于我必须从许多不同的excel表格等中查找所有这些信息,所以我以这种方式编写代码,我认为我可以将它们放在一个大规模的密码查询中,然后在本地主机的/browser上运行它。只要我一次使用的查询不超过4-5000个,它就能工作得很好。然后它在最多5-10秒内创建了整个数据库,但现在当我试图同时运行大约45000个查询时,它已经运行了近24个小时,并且仍然在加载并说“正在执行查询...”。我想知道是否有任何方法可以缩短所需的时间,数据库最终会被创建吗?或者,我可以做一些更智能的索引或其他事情来提高性能吗?因为顺便说一下,我现在不能将密码分成几个部分,因为数据库中的所有内容都与产品有某种联系。我需要重写代码吗?或者有什么平滑的方法吗?

EN

回答 4

Stack Overflow用户

发布于 2014-04-28 23:24:35

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

代码语言:javascript
复制
create (a { name: "foo" })-[:HELLO]->(b {name : "bar"}),
       (c {name: "Baz"})-[:GOODBYE]->(d {name:"Quux"});

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

您还可以从对象创建多个关系,方法是先匹配,然后创建:

代码语言:javascript
复制
match (a {name: "foo"}), (d {name:"Quux"}) create (a)-[:BLAH]->(d);

当然,您可以有多个匹配子句和多个create子句。

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

您尚未指定正在运行的查询不是“停止加载”。请使用详细信息更新您的问题,并让我们知道您尝试过的内容,也许这可能会有所帮助。

票数 21
EN

Stack Overflow用户

发布于 2019-02-27 10:36:45

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

代码语言:javascript
复制
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});

在这里,用户节点已经存在,您已经创建了一个新的关系和一个新的post节点。

票数 8
EN

Stack Overflow用户

发布于 2014-04-29 16:53:21

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23336802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档