我有一个具有3种节点类型和两种关系的图形数据库:
(p:PERSON)-[:manages]->(c:COMPANY)-[:seeks]->(s:SKILLS)
我想在标记为
(:PERSON)
例如:
(p1:PERSON)-[:competes_with]->(p2:PERSON)
和
(p2:PERSON)-[:competes_with]->(p1:PERSON)
从属于
p1.name <> p2.name
。
这样我就可以在各种市场中代表稀缺劳动力的竞争
(s:SKILLS)
。
建立新关系的条件
[:competes_with]
是两个不同的人节点
(:人)
管理寻求至少3个
(:SKILLS)
这两家公司之间一致的简介。
数量级为:
|(:人)|=6000
|(:公司)|=15000
|(:SKILLS)|=95000
以我缓慢的方式,我所做的是:
MATCH (p1:PERSON)-[:manages]->(:COMPANY)-[:seeks]->(s:SKILLS)
WITH p1, collect(DISTINCT s.skill_names) AS p1_skills
MATCH (p2:PERSON)-[:manages]->(:COMPANY)-[:seeks]->(s:SKILLS)
WITH p1,p1_skills, p2, collect(DISTINCT s.skill_names) AS p2_skills
WHERE p1 <> p2
UNWIND p1_skills AS sought_skills
WITH p1,p2, sought_skills, reduce(com_skills=[], sought_skills IN p2_skills | com_skills + sought_skills) AS NCS
WHERE size(NCS) >= 3
MERGE(p1)-[competes_with]->(p2)
MERGE(p2)-[competes_with]->(p1)
考虑到问题的大小,这会导致14GB RAM盒在一段时间后崩溃,并出现“内存不足”异常。
因此,除了我不知道我的查询是否真的符合我的要求(它在完成之前崩溃)之外,问题是:
我是否可以简化此操作,使其能够满足更小的内存需求?改进后的查询是什么样的?
德克萨斯州。