GraphGists

学习管理系统(LMS)通常部署在大型组织中,以支持与业务目标一致的学习过程。这些系统将员工、组织、认证、课程和职位联系起来,以补充业务战略。这个Graph gist模型展示了该生态系统的一部分——认证路径和职位对认证的依赖性。

领域

一项认证有一个或多个学习路径。学习路径是必须按顺序完成的项目序列,才能获得认证。学习项目可以通过参加课程或证明工作经验来完成。课程有授课类型——可以是基于网络的或课堂授课。工作经验指定了完成它所需的时长。要获得一项认证,员工可以选择任何学习路径并完成其中的所有项目。

员工持有认证并完成课程和工作经验。员工可能担任需要任职者拥有特定认证的职位。

排除项

职业发展路径、员工技能、课程定价、目标、再认证等。还缺少机构和讲师(参见:https://gist.neo4j.org/?8021580

目标

该模型将帮助我们回答以下问题

  1. 作为一名员工,获得某项认证的先决条件是什么?

  2. 作为一名员工,要获得X认证,我有哪些学习路径可以选择?

  3. 作为一名员工,如果我以职位Y为目标,我还缺少哪些认证?

  4. 作为一个组织,我的组织中有哪些人未获得其担任职位所需的认证?

  5. 作为一个组织,有哪些潜在职位可供一名员工选择?

模型

实体

  • 带有名称属性的认证

  • 带有名称属性的学习项目

  • 带有名称和授课模式属性的课程

  • 带有小时属性的工作经验

  • 带有名称属性的职位

  • 带有名称属性的人员

每个实体将根据其类型进行标记。此外,课程的授课模式被建模为一个标签。对于我们想要回答的上述问题,这已经足够了,没有必要也将授课模式建模为一个属性。

关系

  • 一项认证有一个或多个学习路径。

  • 一项认证是一个或多个其他认证的先决条件。

  • 一个学习路径包含一个有序的学习项目列表。

  • 一个学习项目通过课程或工作经验来完成。

  • 一个职位需要一个或多个认证。

  • 一名员工担任一个职位。

  • 一名员工持有一个或多个认证。

  • 一名员工完成一个或多个课程。

  • 一名员工完成一个或多个工作经验。

一个认证路径包含一个或多个有序的学习项目。由于一个认证可以有多个路径,并且路径上的项目可能重复,我们需要一种方法来确定哪些项目构成一个学习路径。因此,认证路径被建模为一个链,其中每个“next”关系都由学习路径名称限定。

请注意,从认证到其学习项目的关系使用相同的关系类型进行建模:NEXT_LEARNING。这使得从认证开始查询整个路径变得更容易。

这从一个满足以下条件的模型演变而来

(certification)-[:HAS_LEARNING_PATH]->(learningItem)-[:NEXT]->(learningItem)-[:NEXT]->(learningItem)

两个关系没有带来直接价值,反而增加了目标查询的复杂性,因此被重构为一个单一关系。

其他关系是显而易见的。

图的无模式特性带来的一个好处是,可以将任何类型的实体附加到学习项目中来完成它们,并且仍然可以像使用上述简化模型那样运行相同类型的查询。

设置

match (n) return n

查询

认证3的先决条件是什么?

MATCH (c:Certification {name:"Cert3"})<-[:IS_PREREQUISITE]-(prereq)
RETURN prereq.name

Cert1有哪些学习路径?

MATCH p=(c:Certification {name:"Cert1"})-[lp:NEXT_LEARNING*]->(li)-[:FULFILLED_BY]->(f)
WITH head(lp).path as startPath,lp,p,f
WHERE ALL (x in lp where x.path=startPath)
RETURN p

要获得Cert1认证,我有哪些学习路径可以只包含基于网络的课程?

MATCH p=(cert:Certification {name:"Cert1"})-[lp:NEXT_LEARNING*]->(li)
WITH (last(nodes(p))) as lastItem,li,p,lp
WHERE ((li)-[:FULFILLED_BY]->(:Web)) and (not(lastItem)-[:NEXT_LEARNING]->())
WITH head(lp).path as startPath,lp,p
WHERE ALL (x in lp where x.path=startPath)
RETURN p

Person1需要哪些认证才能晋升到Position2?

MATCH (position:Position {name:"Position2"})-[:REQUIRES]->(cert)
WITH cert
MATCH (person:Person {name:"Person1"})
WITH cert,person
WHERE NOT((person)-[:HAS_CERTIFICATION]->(cert))
RETURN cert.name as missingCert

哪些人没有获得其担任职位所需的认证?

MATCH (person:Person)-[:HOLDS_POSITION]->(position:Position)-[:REQUIRES]->(cert)
WHERE NOT((person)-[:HAS_CERTIFICATION]->(cert))
RETURN person.name, COLLECT(cert.name) as missingCerts

根据他目前的认证,Person2有哪些潜在职位?

MATCH (person:Person)-[:HAS_CERTIFICATION]->(cert)
WITH COLLECT(cert) as heldCerts,person
MATCH (position:Position)-[:REQUIRES]->(requiredCert)
WHERE NOT((person)-[:HOLDS_POSITION]->(position))
WITH COLLECT(requiredCert) as requiredCerts,heldCerts,position
WHERE ALL(rc in requiredCerts where rc in heldCerts)
RETURN position.name

创建人:Luanne Misquitta

© . All rights reserved.