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岁男性,表现出喘息和胸闷,患有对倍他米松过敏的高敏反应。

我们期望所有支气管扩张剂类药物(排除倍他米松,因为上述过敏)和黄嘌呤类药物都出现,因为它们是数据集中唯一适合成人的治疗类别。

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岁女性,表现出咳嗽,患有对倍他米松过敏的高敏反应,居住在'14, rue de Bruxelles 75009 PARIS, FRANCE' (纬度:48.88344, 经度:2.33180)。

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

此外,黄嘌呤类药物无需处方,并且也能治疗同类疾病。

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手册中解释的海弗辛公式的一种空安全变体(确实,有些药物无需医生处方)。

© . All rights reserved.