GraphGists

此 GraphGist 代表一个移动应用程序后端,帮助用户根据其身体特征、位置和当前症状查找合适的药物和专家。

我们的最终模型

来自 VIDAL,充满爱意 (Suzanne, Nicolas, Édouard, Marouane, Sébastian, Thibaut, Olivier, Sylvain, Florent (又名 Cypher 翻译器))。

用户故事

症状自动完成

作为应用程序用户,
当我开始输入我的症状会按字母顺序返回匹配的症状。

示例

用户输入“c”。

MATCH (s:Symptom)
WHERE toUpper(s.name)=~ toUpper('c.*')
RETURN s.name AS `Symptom`
ORDER BY s.name ASC

为了简单起见,此查询将不会包含在以下示例中。但是,它肯定会成为每个查询的第一个子句(因为用户只输入症状的开头)。后续查询将假设这些症状名称已通过此第一个子查询解析。

药物顾问

作为应用程序用户,
当我开始输入我的症状

会返回合适的药物,按其治疗类别分组。

示例

当前用户是一位 35 岁的男性,表现出喘息胸闷,患有对倍他米松过敏的过敏症。

我们期望所有类别为 BronchodilatorsBetametasone 药物除外,因为存在上述过敏症)和 Xanthine 的药物出现,因为它们是数据集中适合成人的唯一治疗类别。

MATCH (patho:Pathology)-[:MAY_MANIFEST_SYMPTOMS]->(symptoms:Symptom)
WHERE symptoms.name IN ['Chest tightness', 'Wheezing']
WITH patho

MATCH (DrugClass:DrugClass)-[cures:CURES]->(patho)
WHERE cures.age_min <= 35 AND 35 < cures.age_max
WITH DrugClass

MATCH (drug:Drug)-[:BELONGS_TO_CLASS]->(DrugClass), (allergy:ALLERGY)
WHERE allergy.name IN ['Hypersensitivity to Betametasone']
AND (NOT (drug)-[:MAY_CAUSE_ALLERGY]->(allergy))
RETURN DrugClass.name AS `Therapeutic class`, COLLECT(DISTINCT drug.name) AS `Drugs`;

医生查找器

作为应用程序用户,
当我开始输入我的症状

会返回可以开具适当药物的医生,以及这些药物,按距离排序。

请参阅上述定义,了解“适当药物”的含义。如果可以无需处方购买药物,则应返回“无需医生”的说明,以及到用户住处的距离(为 0)。

示例

当前用户是一位 19 岁的女性,表现出咳嗽,患有对倍他米松过敏的过敏症,住在“法国巴黎 75009 区布鲁塞尔街 14 号”(纬度:48.88344,经度:2.33180)。

我们期望返回所有血管科医生,因为他们可以开具的药物可以治疗与用户症状相关的疾病。

此外,类别为 Xanthine 的药物无需处方,它们也能治疗同类型的疾病。

MATCH (patho:Pathology)-[:MAY_MANIFEST_SYMPTOMS]->(symptoms:Symptom)
WHERE symptoms.name IN ['Cough']
WITH patho

MATCH (DrugClass:DrugClass)-[cures:CURES]->(patho)
WHERE cures.age_min <= 19 AND 19 < cures.age_max
WITH DrugClass

MATCH (drug:Drug)-[:BELONGS_TO_CLASS]->(DrugClass), (allergy:ALLERGY)
WHERE allergy.name IN ['Hypersensitivity to Betametasone']
AND (NOT (drug)-[:MAY_CAUSE_ALLERGY]->(allergy))
WITH DrugClass, drug

OPTIONAL MATCH  (doctor:Doctor)-->(spe:DoctorSpecialization)-[:CAN_PRESCRIBE]->(DrugClass)
RETURN COALESCE(doctor.name + ' (' + spe.name + ')', 'No doctor required') AS `Doctor`, COLLECT(DISTINCT drug.name) AS `Drugs for your symptoms`, 2 * 6371 * asin(sqrt(haversin(radians(48.88344 - COALESCE(doctor.latitude,48.88344))) + cos(radians(48.88344)) * cos(radians(COALESCE(doctor.latitude,90)))* haversin(radians(2.33180 - COALESCE(doctor.longitude,2.33180))))) AS `Distance to home (km)`
ORDER BY `Distance to home (km)` ASC;

尽管看起来很复杂,但距离计算只是在 Cypher 手册中解释的正弦公式的空安全变体(实际上,有些药物无需医生处方)。