GraphGists

使用 Wiley 治疗计划

我使用“Wiley 治疗计划”数据集作为我们领域模型的基础,因为它是在行为健康领域使用的一种标准。行为健康领域治疗的一个关键方面是创建四部分治疗计划,打包为库,包括问题、目标、目标和干预措施。

问题

问题一般来说指的是患者正在遭受的痛苦。例如,这可能是抑郁症、自卑、药物滥用或其他问题。

目标

目标是最终结果。例如,患者的目标可能是“表现出对自我和他人的尊重和关怀”。

目标

目标是患者从问题到目标的路上所达成的里程碑:患者将改进的方式。

干预措施

干预措施是作为计划的一部分执行的任务或活动。这些可能是患者和参与治疗计划的其他人采取的行动。

额外复杂性

在实践中,上面描述的模型中存在一些问题,使关系数据库难以实施 Wiley 计划。

第一个问题是存在从问题到目标到干预措施的链接,这将干预措施限制为仅与特定问题和/或目标相关的干预措施。在 SQL 数据库中设置此项需要一个单独的表格来维护每个计划的“链接”。生成适当的计划需要多次遍历链接表格,导致查询运行时间从两秒到十秒不等,具体取决于加载的库数量。

第二个变化是并非所有人都按照定义的问题→目标→目标→干预措施顺序使用该计划。治疗计划系统的任何实际实施都必须允许用户从计划中的任何一点开始并从那里开始工作。例如,用户可以从目标开始,然后跳到干预措施,然后跳到问题。

第三,信息(目标、目标、干预措施)是重复使用的。例如,目标 A 可以在库 A 中用于问题 A,但它也可以在同一个库中的其他问题中或跨库使用。

Domain Model
图 1. Wiley 治疗计划领域模型

使用 Neo4j 实施 Wiley 计划

在 Neo4j 中实施该模型产生了 300 个节点和 120k 个关系。典型的查询在大约 500 毫秒内运行并返回 500-700 个值。此外,添加偏离 Wiley 计划的自定义计划也很容易,并且不会影响性能。

Domain Model
图 2. 修改后的 Wiley 治疗计划领域模型

节点

(:Library)
(:Problem)
(:Goal)

关系

(:Library)-[:HAS_PROBLEM]->(:Problem)-[:HAS_GOAL]->(:Goal)
(:Problem)-[:HAS_OBJECTIVE]->(:Objective)
(:Problem)-[:HAS_INTERVENTION]->(:Intervenion)

示例数据集

示例数据集使用一个库、一个问题和四个目标、目标和干预措施。

用例

显示所有目标

MATCH (c:Objective)
RETURN c.Description AS Objective

显示所有问题

MATCH (c:Problem)
RETURN c.Description AS Problem

显示所有目标

MATCH (c:Goal)
RETURN c.Description AS Goal

查找所有库和问题编号 17 的干预措施

MATCH (lib:Library)-[:HAS_PROBLEM]->(st:Problem{name:'17'})-[:HAS_INTERVENTION]-(i:Intervention)
RETURN lib.Description AS Library, st.Description AS Problem, i.Description AS Intervention;

显示一个库的所有问题、干预措施和目标

MATCH (lib:Library{GroupID:'230'})-[:HAS_PROBLEM]->(st:Problem{name:'17'})-[:HAS_INTERVENTION]-(i:Intervention) with i,st MATCH (st)-[:HAS_OBJECTIVE]->(m:Objective)
RETURN st.Description AS Problem, m.Description AS Objective, i.Description AS Intervention;

结论

在 SQL 中开发治疗计划需要几个月才能使它正确并使其性能达到可用的程度。我使用 py2neo 将数据导入到图中。总的来说,从头到尾不到一周的时间就完成了(创建这个简短的笔记花了更长时间)。