gpt4 book ai didi

neo4j - 使用 MERGE 或 MATCH 将关系插入 Neo4j 将永远运行

转载 作者:行者123 更新时间:2023-12-01 06:06:46 27 4
gpt4 key购买 nike

我正在使用一个简单的位置数据集来试验 Neo4j。一个位置可以与另一个关系有关系。
a:位置 - [rel] - b:位置

我已经在数据库中有位置(大约 700.000+ 位置条目)

现在我想添加关系数据(170M 边),但我想先用较小的集合试验导入逻辑,所以我基本上选择了集合中的 2 个节点并尝试创建如下关系。

MERGE p =(a:Location {locationid: 3616})-[w:WikiLink]->(b:Location {locationid: 467501})
RETURN p;

并且还直接从文档中尝试了该方法
MATCH (a:Person),(b:Person)
WHERE a.name = 'Node A' AND b.name = 'Node B'
CREATE (a)-[r:RELTYPE { name : a.name + '<->' + b.name }]->(b)
RETURN r

我尝试使用定向合并、非定向合并等。我基本上尝试了上述查询的多个变体,结果是:它们永远运行,即使在 15 分钟后似乎也没有完成。这很奇怪。
Indexes
ON :Location(locationid) ONLINE (for uniqueness constraint)

Constraints
ON (location:Location) ASSERT location.locationid IS UNIQUE

这是我目前正在使用的:
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:///edgelist.csv' AS line WITH line
MATCH (a:Location {locationid: toInt(line.locationidone)}), (b:Location {locationid: toInt(line.locationidtwo)})
MERGE (a)-[w:WikiLink {weight: toFloat(line.edgeweight)}]-(b)
RETURN COUNT(w);

如果您查看下面的终端输出,您可以看到 Neo4j 报告 258 毫秒的查询执行时间,但实时时间稍高于该时间。在我看来,这个查询已经花费了几秒钟的时间(运行它的机器有 48GB RAM、16 核并且相对较新)。
我目前正在使用 LIMIT 1000 运行此查询(之前是 LIMIT 1 )但脚本已经运行了几分钟。我想知道我是否必须从 MERGE 切换到 CREATE。问题是,我无法理解 EXPLAIN 的调用图给我以确定瓶颈。
time /usr/local/neo4j/bin/neo4j-shell -file import-relations.cql 
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| p |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [Node[758609]{title:"Tehran",locationid:3616,locationlabel:"NIL"},:WikiLink[9422418]{weight:1.2282325516616477E-7},Node[917147]{title:"Khorugh",locationid:467501,locationlabel:"city"}] |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row
Relationships created: 1
Properties set: 1
258 ms

real 0m1.417s
user 0m1.497s
sys 0m0.158s

EXPLAIN of the query

最佳答案

如果你还没有:

create constraint on loc:Location assert loc.locationid is unique;

然后找到两个节点,并创建关系。
MATCH (a:Location {locationid: 3616}),(b:Location {locationid: 467501})
MERGE p = (a)-[w:WikiLink]->(b)
RETURN p;

或者如果这些位置还不存在:
MERGE (a:Location {locationid: 3616})
MERGE (b:Location {locationid: 467501})
MERGE p = (a)-[w:WikiLink]->(b)
RETURN p;

如果从程序中执行此操作,也应该使用参数。

关于neo4j - 使用 MERGE 或 MATCH 将关系插入 Neo4j 将永远运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37839939/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com