2019-11-27 08:33:03 +00:00
|
|
|
|
const mockNodes = {
|
2019-11-27 05:49:19 +00:00
|
|
|
|
Q2840: {
|
|
|
|
|
id: 'Q2840',
|
|
|
|
|
name: 'Grippe',
|
|
|
|
|
types: ['Maladie'],
|
|
|
|
|
weight: 0.000035
|
|
|
|
|
},
|
|
|
|
|
Q154882: {
|
|
|
|
|
id: 'Q154882',
|
|
|
|
|
name: 'Légionellose',
|
|
|
|
|
types: ['Maladie'],
|
|
|
|
|
weight: 0.000015
|
|
|
|
|
},
|
|
|
|
|
Q155098: {
|
|
|
|
|
id: 'Q155098',
|
|
|
|
|
name: 'Leptospirose',
|
|
|
|
|
types: ['Maladie'],
|
|
|
|
|
weight: 0.00001
|
|
|
|
|
},
|
|
|
|
|
Q326663: {
|
|
|
|
|
id: 'Q326663',
|
|
|
|
|
name: 'Encéphalite à tiques',
|
|
|
|
|
types: ['Maladie'],
|
|
|
|
|
weight: 0.000001
|
|
|
|
|
},
|
|
|
|
|
Q133780: {
|
|
|
|
|
id: 'Q133780',
|
|
|
|
|
name: 'Peste',
|
|
|
|
|
types: ['Maladie'],
|
|
|
|
|
weight: 0.000032
|
|
|
|
|
},
|
|
|
|
|
Q38933: {
|
|
|
|
|
id: 'Q38933',
|
|
|
|
|
name: 'Fièvre',
|
|
|
|
|
types: ['Symptôme']
|
|
|
|
|
},
|
|
|
|
|
Q474959: {
|
|
|
|
|
id: 'Q474959',
|
|
|
|
|
name: 'Myalgie',
|
|
|
|
|
types: ['Symptôme']
|
|
|
|
|
},
|
|
|
|
|
Q86: {
|
|
|
|
|
id: 'Q86',
|
|
|
|
|
name: 'Céphalée',
|
|
|
|
|
types: ['Signe']
|
|
|
|
|
},
|
|
|
|
|
Q1115038: {
|
|
|
|
|
id: 'Q1115038',
|
|
|
|
|
name: 'Rhinorrhée',
|
|
|
|
|
types: ['Symptôme']
|
|
|
|
|
},
|
|
|
|
|
Q9690: {
|
|
|
|
|
id: 'Q9690',
|
|
|
|
|
name: 'Fatigue',
|
|
|
|
|
types: ['Symptôme']
|
|
|
|
|
},
|
|
|
|
|
Q127076: {
|
|
|
|
|
id: 'Q127076',
|
|
|
|
|
name: 'Vomissement',
|
|
|
|
|
types: ['Symptôme', 'Signe']
|
|
|
|
|
},
|
|
|
|
|
Q178061: {
|
|
|
|
|
id: 'Q178061',
|
|
|
|
|
name: 'Choc circulatoire',
|
|
|
|
|
types: ['Maladie'],
|
|
|
|
|
weight: 0.000038
|
|
|
|
|
},
|
|
|
|
|
Q35805: {
|
|
|
|
|
id: 'Q35805',
|
|
|
|
|
name: 'Toux',
|
|
|
|
|
types: ['Symptôme', 'Signe']
|
|
|
|
|
},
|
|
|
|
|
Q647099: {
|
|
|
|
|
id: 'Q647099',
|
|
|
|
|
name: 'Hémoptysie',
|
|
|
|
|
types: ['Symptôme']
|
|
|
|
|
},
|
|
|
|
|
Q653197: {
|
|
|
|
|
id: 'Q653197',
|
|
|
|
|
name: 'Rash',
|
|
|
|
|
types: ['Symptôme', 'Signe']
|
|
|
|
|
},
|
|
|
|
|
Q160796: {
|
|
|
|
|
id: 'Q160796',
|
|
|
|
|
name: 'Syndrome confusionnel',
|
|
|
|
|
types: ['Maladie'],
|
|
|
|
|
weight: 0.000004
|
|
|
|
|
},
|
|
|
|
|
Q186235: {
|
|
|
|
|
id: 'Q186235',
|
|
|
|
|
name: 'Myocardite',
|
|
|
|
|
types: ['Maladie'],
|
|
|
|
|
weight: 0.0000075
|
|
|
|
|
},
|
|
|
|
|
Q476921: {
|
|
|
|
|
id: 'Q476921',
|
|
|
|
|
name: 'Insuffisance rénale',
|
|
|
|
|
types: ['Maladie'],
|
|
|
|
|
weight: 0.0000046
|
|
|
|
|
},
|
|
|
|
|
Q281289: {
|
|
|
|
|
id: 'Q281289',
|
|
|
|
|
name: 'Photophobie',
|
|
|
|
|
types: ['Signe']
|
|
|
|
|
},
|
|
|
|
|
Q159557: {
|
|
|
|
|
id: 'Q159557',
|
|
|
|
|
name: 'Coma',
|
|
|
|
|
types: ['Signe']
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2019-11-27 08:33:03 +00:00
|
|
|
|
const mockEdges = [
|
2019-11-27 05:49:19 +00:00
|
|
|
|
['Q2840', 'Q38933'],
|
|
|
|
|
['Q2840', 'Q1115038'],
|
|
|
|
|
['Q2840', 'Q474959'],
|
|
|
|
|
['Q2840', 'Q86'],
|
|
|
|
|
['Q2840', 'Q9690'],
|
|
|
|
|
|
|
|
|
|
['Q154882', 'Q86'],
|
|
|
|
|
['Q154882', 'Q38933'],
|
|
|
|
|
['Q154882', 'Q35805'],
|
|
|
|
|
['Q154882', 'Q474959'],
|
|
|
|
|
|
|
|
|
|
['Q155098', 'Q38933'],
|
|
|
|
|
['Q155098', 'Q474959'],
|
|
|
|
|
['Q155098', 'Q86'],
|
|
|
|
|
['Q155098', 'Q476921'],
|
|
|
|
|
['Q155098', 'Q186235'],
|
|
|
|
|
['Q155098', 'Q653197'],
|
|
|
|
|
|
|
|
|
|
['Q326663', 'Q86'],
|
|
|
|
|
['Q326663', 'Q474959'],
|
|
|
|
|
['Q326663', 'Q38933'],
|
|
|
|
|
['Q326663', 'Q9690'],
|
|
|
|
|
['Q326663', 'Q281289'],
|
|
|
|
|
['Q326663', 'Q159557'],
|
|
|
|
|
['Q326663', 'Q127076'],
|
|
|
|
|
|
|
|
|
|
['Q133780', 'Q38933'],
|
|
|
|
|
['Q133780', 'Q86'],
|
|
|
|
|
['Q133780', 'Q127076'],
|
|
|
|
|
['Q133780', 'Q474959'],
|
|
|
|
|
['Q133780', 'Q178061'],
|
|
|
|
|
['Q133780', 'Q35805'],
|
|
|
|
|
['Q133780', 'Q647099'],
|
|
|
|
|
['Q133780', 'Q653197'],
|
|
|
|
|
['Q133780', 'Q160796']
|
|
|
|
|
];
|
|
|
|
|
|
2019-11-27 08:33:03 +00:00
|
|
|
|
/**
|
|
|
|
|
* Vérifie si une liste d’arêtes contient une arête donnée, dans un sens ou
|
|
|
|
|
* dans l’autre.
|
|
|
|
|
*
|
|
|
|
|
* @param list Liste d’arêtes.
|
|
|
|
|
* @param from Premier nœud de l’arête.
|
|
|
|
|
* @param to Second nœud de l’arête.
|
|
|
|
|
* @return Vrai si et seulement si l’arête existe.
|
|
|
|
|
*/
|
|
|
|
|
const includesEdge = (list, from, to) =>
|
|
|
|
|
list.some(([source, target]) => (
|
|
|
|
|
(source === from && target === to)
|
|
|
|
|
|| (source === to && target === from)
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
export const searchTerms = terms => new Promise((res, rej) =>
|
|
|
|
|
{
|
|
|
|
|
// Fait attendre artificiellement pour simuler une requête
|
|
|
|
|
setTimeout(() =>
|
|
|
|
|
{
|
|
|
|
|
const nodes = {};
|
|
|
|
|
const edges = [];
|
|
|
|
|
|
|
|
|
|
// Récupération des identifiants correspondant aux termes de la requête
|
|
|
|
|
const termIds = terms.map(term =>
|
|
|
|
|
Object.keys(mockNodes)
|
|
|
|
|
.find(id => mockNodes[id].name === term)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Si l’un des termes est inconnu, aucun résultat
|
|
|
|
|
if (!termIds.includes(undefined))
|
|
|
|
|
{
|
|
|
|
|
// Sélection des termes de la requête
|
|
|
|
|
for (let termId of termIds)
|
|
|
|
|
{
|
|
|
|
|
nodes[termId] = mockNodes[termId];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Sélection des nœuds liés à tous les éléments de la requête
|
|
|
|
|
const resultIds = [];
|
|
|
|
|
|
|
|
|
|
for (let [id, data] of Object.entries(mockNodes))
|
|
|
|
|
{
|
|
|
|
|
if (termIds.every(
|
|
|
|
|
termId => includesEdge(mockEdges, id, termId)
|
|
|
|
|
))
|
|
|
|
|
{
|
|
|
|
|
nodes[id] = data;
|
|
|
|
|
resultIds.push(id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Sélection des voisins des résultats de la requête
|
|
|
|
|
for (let [id, data] of Object.entries(mockNodes))
|
|
|
|
|
{
|
|
|
|
|
for (let resultId of resultIds)
|
|
|
|
|
{
|
|
|
|
|
if (includesEdge(mockEdges, resultId, id))
|
|
|
|
|
{
|
|
|
|
|
nodes[id] = data;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Sélection des arêtes liant les nœuds sélectionnés
|
|
|
|
|
for (let [from, to] of mockEdges)
|
|
|
|
|
{
|
|
|
|
|
if (
|
|
|
|
|
(from in nodes && to in nodes)
|
|
|
|
|
&& !includesEdge(edges, from, to)
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
edges.push([from, to]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-11-27 05:49:19 +00:00
|
|
|
|
|
2019-11-27 08:33:03 +00:00
|
|
|
|
res({nodes, edges});
|
|
|
|
|
}, 500);
|
|
|
|
|
});
|