231 lines
5.5 KiB
JavaScript
231 lines
5.5 KiB
JavaScript
const mockNodes = {
|
||
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']
|
||
}
|
||
};
|
||
|
||
const mockEdges = [
|
||
['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']
|
||
];
|
||
|
||
/**
|
||
* 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]);
|
||
}
|
||
}
|
||
}
|
||
|
||
res({nodes, edges});
|
||
}, 500);
|
||
});
|