【发布时间】:2018-04-18 19:42:00
【问题描述】:
我有一个包含 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] 的条件是2 个不同的人员节点(:PERSON) 管理的公司寻求至少3 个(:SKILLS) 配置文件在2 个公司之间重合。
数量级为:
|(:人)| = 6000
|(:公司)| = 15000
|(:技能)| = 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 盒在一段时间后崩溃,并出现“内存不足”异常。
所以,除了我不知道我的查询是否真的做了我想要的(它在完成之前崩溃)之外,问题是:
我可以简化它以使其在更小的内存需求下工作吗?改进后的查询会是什么样子? Tx.
【问题讨论】:
标签: database graph neo4j cypher