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

beq87vna  于 2022-11-05  发布在  其他
关注(0)|答案(5)|浏览(330)

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

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

该示例中大约有4000个具有唯一节点的节点。
然后我把关系表述为:

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

大约有4万个这样独特的关系。
对于较小规模的图,这完全不是问题。但是对于这个图,执行查询永远不会停止加载。
有什么建议我可以使这种类型的查询工作?或者我应该做什么代替?
编辑。我试图建立的是一个产品的大图,它的发行版,发行版本,功能等,以同样的方式,电影图的例子是建立。
该产品总共有6个版本,每个版本大约有20个版本。总共有371个功能,其中有438个功能版本。(总共120个)然后每个都有大约2-300个featureversion。这些featureversion被Map到它的特性,该特性对数据库中的所有东西都有一点点依赖性。我还涉及了硬件依赖性,例如运行这些功能的可能硬件、发布版本等,因此基本上我使用了密码代码,例如:

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表等中找到所有这些信息,我这样做的代码,我想我可以把它放在一起在一个大规模的密码查询,并运行它在/浏览器上的localhost.它的工作真的很好,只要我不使用超过4-5000查询一次.然后,它创建整个数据库在大约5-10秒最多.但是现在当我试图同时运行大约45000个查询时,它已经运行了将近24小时,并且仍然在加载和说“正在执行查询......"。我想知道是否有任何方法可以改善它所花费的时间,数据库最终会被创建吗?或者我可以做一些更智能的索引或其他事情来提高性能吗?因为我的密码是这样写的,我不能把它分成几部分,因为数据库中的所有东西都与产品有某种联系。我需要重写代码吗?或者有什么顺利的方法吗?

ct2axkht

ct2axkht1#

您可以使用一个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子句和多个create子句。
您可以尝试匹配给定类型的节点,然后从该类型的节点创建所有必要的关系。您有足够多的关系,这将需要许多查询。确保您已经索引了您正在使用的属性来匹配节点。随着数据库变得越来越大,这将是重要的,以允许快速查找您试图创建新关系的内容。
您尚未指定正在运行的哪个查询未“停止加载”。请使用具体信息更新您的问题,并让我们知道您尝试了哪些方法,也许可以提供帮助。

wgmfuz8q

wgmfuz8q2#

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

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});

这里用户节点已经存在,并且您已经创建了一个新关系和一个新帖子节点。

ndasle7k

ndasle7k3#

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

ecr0jaav

ecr0jaav4#

如果你能够使用Neo4j 2.1预发布里程碑,那么你应该尝试使用新的LOAD CSVPERIODIC COMMIT特性,它们就是为这种用例设计的。
LOAD CSV允许您使用一个或多个Cypher模式描述数据结构,同时以CSV格式提供值以避免重复。
PERIODIC COMMIT可以帮助使大型导入更加可靠,还可以通过减少所需的内存量来提高性能。

qgzx9mmu

qgzx9mmu5#

可以使用单个密码查询来创建一个新节点,并将其与现有节点关联。
例如,假设您从以下内容开始:

  • 具有“id”属性“1”的现有“One”节点

您的目标是:

  • 创建第二个节点,我们将其命名为“Two”,它应该具有属性id:“2”
  • 将两个节点关联在一起

您可以使用单个Cypher查询来实现该目标,如下所示:

MATCH (one:One {id:'1'})
CREATE (one) -[:RELATED_TO]-> (two:Two {id:'2'})

相关问题