<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Graph Databases &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/graph-databases/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Thu, 09 Apr 2026 12:23:58 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>Graph Databases &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Graphtechnologieën, de toepassingen ervan en tools: een overzicht (deel 2)</title>
		<link>https://www.smalsresearch.be/graphtechnologieen-toepassingen-en-tools-2/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Thu, 20 Feb 2025 10:01:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Knowledge Graph]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[methodology]]></category>
		<guid isPermaLink="false">/?p=21956</guid>

					<description><![CDATA[Dit tweede deel is gewijd aan graph databases en aan knowledge graphs, hun verschillen en tools.]]></description>
										<content:encoded><![CDATA[
<p><em><a href="/graphes_applications_et_outils_2/">Version française</a></em></p>



<p>Deze blogpost volgt op <a href="/graphtechnologieen-toepassingen-en-tools/">deel 1</a>, die de grondbeginselen van graphtechnologieën, hun algoritmes en toepassingen toelicht. Dit tweede deel is gewijd aan graph databases en aan knowledge graphs, hun verschillen en tools.</p>



<h2 class="wp-block-heading">Graph databases</h2>



<p>Zoals bij een relationele database is ook bij een graph database het doel om gegevens op een persistente manier op te slaan en te beheren en om complexe query&#8217;s uit te voeren. Het verschil is dat de gegevens worden opgeslagen in de vorm van een graph, d.w.z. een verzameling nodes die onderling verbonden zijn door bogen.</p>
<p>Graph databases hebben een aantal voordelen ten opzichte van traditionele relationele databases, omdat het graph model eenvoudige, geoptimaliseerde doorloop van gegevens via bogen mogelijk maakt, terwijl het verkennen van relaties in een relationele database een groot aantal joints kan vereisen. Meer details over de voordelen van graph databases en de situaties waarin ze gebruikt kunnen worden, zijn te vinden in de blogposts [<a href="#footnote-1">1</a>] en [<a href="#footnote-2">2</a>].</p>
<p>De drie componenten van een graph database zijn nodes, bogen en properties. Deze eigenschappen kunnen ofwel op de nodes, ofwel op de bogen, ofwel op beide worden geplaatst. Laten we eens kijken naar het voorbeeld in Figuur 1, de node “Paul” kan bijvoorbeeld gelinkt worden met eigenschappen zoals zijn geboortedatum en adres, voor de nodes die films voorstellen kunnen we eigenschappen associëren zoals het jaar van uitgave, het budget en de IMDb identifier, en op de “RATED” relaties tussen een gebruiker en een film kunnen we eigenschappen associëren zoals de kijkdatum en de waardering (op 5) die de gebruiker aan de film geeft.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2025/02/LPG_EN.png"><img fetchpriority="high" decoding="async" width="1024" height="373" src="/wp-content/uploads/2025/02/LPG_EN-1024x373.png" alt="" class="wp-image-21938" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/02/LPG_EN-1024x373.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/02/LPG_EN-300x109.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/02/LPG_EN-768x280.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/02/LPG_EN.png 1372w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 1: Voorbeeld van nodes en arcs met eigenschappen in Neo4J.</figcaption></figure>



<p>Merk op dat de graph algoritmes die we in <a href="/graphtechnologieen-toepassingen-en-tools/">deel 1</a> hebben gepresenteerd vaak niet zijn geïmplementeerd in graph database software, met een paar uitzonderingen (Neo4j en TigerGraph hebben een “Graph Data Science (GDS)” library die verschillende algoritmes bevat). Over het algemeen is het daarom nodig om de graph (of een deel ervan) te exporteren naar een analysetool.</p>



<h2 class="wp-block-heading">Tools voor graph databases</h2>



<p>Laten we eens snel kijken naar enkele van de bekendste tools. Merk op dat alle hieronder genoemde tools compatibel zijn met <a href="https://nl.wikipedia.org/wiki/ACID">ACID</a>-eigenschappen. Er bestaan een groot aantal tools voor het beheren van graph databases, en deze post noemt er maar een paar. Bekijk <a href="https://db-engines.com/en/ranking/graph+dbms">hier</a> gerust een uitgebreidere lijst.</p>
<ol>
<li>Neo4j</li>
</ol>
<p>Neo4j biedt het voordeel van een native graphformaat, wat het doorlopen van de graph zeer efficiënt maakt (en dus ook de query&#8217;s) De query&#8217;s gebeuren via Cypher, een taal die gemakkelijk te leren is, Neo4J is bovendien goed gedocumenteerd en beschikt over een grote community. Neo4J is in zijn “community”-versie gratis, maar een betalende versie bestaat ook (Neo4J Enterprise), de gratis versie kan een aantal schaalbaarheidsproblemen opleveren bij zeer grote hoeveelheden data.</p>
<ol start="2">
<li>ArangoDB</li>
</ol>
<p>ArangoDB biedt een flexibel datamodel (multimodel), met een graphmodel, een documentmodel (gebaseerd op JSON-objecten) en een key-value model. Het heeft zijn eigen querytaal, AQL (Arango Query Language), die ingewikkelder kan zijn om te leren dan Cypher vanwege het multimodel dat aan de grondslag ligt van ArangoDB. Het programma is betalend, hoewel er ook een opensourceversie bestaat (community edition), maar die is (uiteraard) beperkter dan de betalende versie.</p>
<ol start="3">
<li>TigerGraph</li>
</ol>
<p>TigerGraph is een betalende tool, die geoptimaliseerd is voor gebruik op zeer grote databases. De query&#8217;s gebeuren via de taal GSQL, die het mogelijk maakt om verschillende taken uit te voeren, maar die ingewikkelder is dan Cypher. TigerGraph beschikt over verschillende algoritmes die geïmplementeerd zijn via de GDS library.</p>
<ol start="4">
<li>Memgraph</li>
</ol>
<p>Memgraph is een speciale tool in die zin dat hij gegevens direct in het geheugen bewaart (in RAM). Dit levert zeer hoge prestaties op voor query&#8217;s, maar maakt het aan de andere kant moeilijk te gebruiken, of op zijn minst kostbaar in termen van infrastructuur, als de graph groot is, omdat je genoeg RAM moet hebben om de gegevens op te slaan. Memgraph wordt daarom over het algemeen gebruikt als prestaties de hoogste prioriteit hebben. Query&#8217;s worden gedaan in Cypher.</p>
<ol start="5">
<li>GraphDB</li>
</ol>
<p>GraphDB gebruikt een zeer specifiek graphmodel dat het Resource Description Framework (RDF) wordt genoemd. Dit framework, dat meer in detail zal worden besproken in de sectie Knowledge graphs, heeft zijn eigen querytaal die SPARQL heet. Er bestaat een gratis opensourceversie (graphDB Free) en een betalende enterpriseversie (graphDB Enterprise).</p>
<ol start="6">
<li>Apache TinkerPop en de implementaties ervan</li>
</ol>
<p>Het gaat om een opensource framework voor het definiëren van een graph database en een querytaal die “Gremlin” heet. Het wordt gebruikt in veel graph database management software, zoals JanusGraph (opensource software), Amazon Neptune dat andere modellen biedt dan die van TinkerPop zoals RDF, of nog andere tools voor databasebeheer die niet gespecialiseerd zijn in graphs, zoals Azure Cosmos DB.</p>



<h2 class="wp-block-heading">Knowledge graphs</h2>



<p>Laten we, voordat we naar werkwijzen en tools kijken, eerst definiëren wat een knowledge graph is en hoe deze verschilt van een graph database. Het is een graph die zich richt op semantiek en inferentie. Elke node vertegenwoordigt een concept en elke boog een relatie. Zoals we al hebben gezien in de blogposts [<a href="#footnote-3">3</a>, <a href="#footnote-4">4</a>], wordt een knowledge graph gedefinieerd als een graph die aan drie voorwaarden voldoet [<a href="#footnote-5">5</a>]:</p>
<ol>
<li>De integratie van informatie uit verschillende heterogene bronnen.</li>
</ol>
<p>Een knowledge graph verzamelt en combineert gegevens uit verschillende (on)gestructureerde bronnen op een coherente manier.</p>
<ol>
<li>Het gebruik van een ontologie.</li>
</ol>
<p>Een ontologie beschrijft formeel de concepten en relaties die aanwezig zijn in de graph, evenals eventuele beperkingen en regels. Het is dus een gestructureerd model dat de semantische basis biedt voor logische bewerkingen en coherentietesten. Een ontologieschema (zie Figuur 2), ook bekend als een &#8216;ontology graph&#8217;, biedt bijvoorbeeld een representatie van de entiteittypes en relaties van een knowledge graph, en biedt zo een conceptuele structuur zonder specifieke gegevens te bevatten.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/02/Ontology_EN.png"><img decoding="async" width="868" height="561" src="/wp-content/uploads/2025/02/Ontology_EN.png" alt="" class="wp-image-21937" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/02/Ontology_EN.png 868w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Ontology_EN-300x194.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Ontology_EN-768x496.png 768w" sizes="(max-width: 868px) 100vw, 868px" /></a><figcaption class="wp-element-caption">Figuur 2: Voorbeeld van ontologieschema</figcaption></figure>



<ol>
<li>Inferentie van impliciete informatie op basis van expliciete informatie.</li>
</ol>
<p>Het is mogelijk om informatie te vinden die niet aanwezig was in de oorspronkelijke gegevens op basis van inferentieregels (zie Figuur 3).</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-6.png"><img decoding="async" width="748" height="287" src="/wp-content/uploads/2025/01/image-6.png" alt="" class="wp-image-21762" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-6.png 748w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-6-300x115.png 300w" sizes="(max-width: 748px) 100vw, 748px" /></a><figcaption class="wp-element-caption">Figuur 3: Voorbeelden van inferentie. Uit een vorige <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">blogpost</a>.</figcaption></figure>



<h2 class="wp-block-heading">Een overzicht van het RDF-model (Resource Description Framework)</h2>



<p>Het RDF-model, oorspronkelijk ontworpen voor de formele beschrijving van web resources en de metadata ervan, wordt vaak gebruikt bij knowledge graphs omdat het robuust semantisch rederneren en een zeer hoge interoperabiliteit biedt.</p>
<p>Een RDF-document heeft de vorm van een set RDF-triples waarbij elk triple een associatie is: subject (te beschrijven bron), predicaat (eigenschap van de bron), object (gegevens of andere bron).</p>
<p>Bijvoorbeeld:</p>
<p><code>:Alice&nbsp;:knows&nbsp;:Bob .<br />:Alice&nbsp;:livesIn&nbsp;:Paris .<br />:Alice&nbsp;:age 30 .</code></p>
<p>Deze semantic triples vertegenwoordigen dus zowel relaties tussen nodes (bijvoorbeeld de relatie tussen Alice en Bob) als eigenschappen (de leeftijd van Alice).</p>
<p>Kenmerkend voor RDF is dat elk element van een triple (met uitzondering van het object als het een simpele waarde is, zoals de waarde 30 voor de leeftijd van Alice) door een URI (<em>Uniform Resource Identifier</em>) of IRI (<em>Internationalized Resource Identifier</em>) moet worden geïdentificeerd. Dit zorgt voor een hoge mate van interoperabiliteit, omdat het voorkomt dat er duplicaten ontstaan wanneer verschillende informatiebronnen worden gecombineerd. Als we teruggaan naar de eerder gebruikte triples, krijgen we het volgende fragment (in Turtle-taal):</p>
<p><code>&lt;http://example.org/Alice&gt; &lt;http://example.org/knows&gt; &lt;http://example.org/Bob&gt; .<br />&lt;http://example.org/Alice&gt; &lt;http://example.org/livesIn&gt; &lt;http://example.org/Paris&gt; .<br />&lt;http://example.org/Alice&gt; &lt;http://example.org/age&gt; "30"^^&lt;http://www.w3.org/2001/XMLSchema#integer&gt; .</code></p>
<p>Het gebruik van RDF impliceert daarom een URI om alle concepten (subjecten, predikaten en objecten) in de graph te kunnen identificeren op dezelfde manier als een primaire sleutel in relationele databases.</p>
<p>Bovendien bestaan er twee hulpmiddelen om semantische betekenis toe te voegen aan RDF-gegevens door relaties te beschrijven om redeneren mogelijk te maken, namelijk RDFS (<em>RDF Schema</em>) en OWL (<em>Web Ontology Language</em>). Zoals we al hebben gezien, vereist RDF dat elk concept wordt geïdentificeerd door een URI. RDFS en OWL bieden een voorgedefinieerde set URI&#8217;s voor veelgebruikte concepten waarnaar verwezen kan worden in RDF. Dit maakt het mogelijk om een gestandaardiseerd gemeenschappelijk vocabularium te hebben, wat de integratie met andere databanken vergemakkelijkt, en om inferentieregels op te stellen. Aangezien OWL en RDFS <strong>gestandaardiseerde concepten</strong> aanbieden, kunnen OWL-gebaseerde &#8216;reasoners&#8217; (zoals FaCT++ of HermiT) op een systematische manier impliciete relaties afleiden of tegenstrijdigheden detecteren op basis van de ontologie.</p>
<p>Query&#8217;s op een RDF database worden gedaan via SPARQL.</p>



<h2 class="wp-block-heading">Alternatieven voor RDF en tools voor het werken met een knowledge graph</h2>



<p>Natuurlijk is het voor een knowledge graph niet noodzakelijk om het RDF-model te gebruiken. Een graph wordt als een knowledge graph beschouwd als voldaan is aan de 3 voorwaarden die beschreven zijn aan het begin van het hoofdstuk over knowledge graphs. Het is dus perfect mogelijk om een knowledge graph te creëren in een klassieke graph databasemanagementtool, zolang de implementatie data uit verschillende bronnen combineert, voldoet aan een ontologie en gebruikt kan worden voor semantische inferentie.</p>
<p>De voornaamste kracht van het RDF-model is zijn hoge standaardisatieniveau. Enerzijds laat het een hoge mate van interoperabiliteit toe dankzij de URI-identificatievereiste en de gestandaardiseerde woordenschat en querytaal. Anderzijds bieden de RDFS- en OWL-uitbreidingen een schat aan semantische informatie voor automatisch redeneren. Omgekeerd beperkt de complexiteit het gebruik in zakelijke toepassingen waar deze semantische nauwkeurigheid niet noodzakelijk is en waar het gebruik van een eenvoudiger graphmodel (zoals Neo4j of TigerGraph) volstaat. Het gebruik van eenvoudigere modellen heeft het voordeel dat ze eenvoudiger en sneller op te zetten zijn en optimale query prestaties bieden, maar ten koste van het verlies van de semantische rijkdom die RDF biedt.</p>
<p>In deze sectie worden (niet-exhaustieve) tools met betrekking tot RDF voorgesteld, maar zoals vermeld blijven de tools die eerder werden vermeld voor graph databases geldig voor het creëren van een knowledge graphs zolang aan de voorwaarden wordt voldaan.</p>
<p>Hier is een lijst van enkele tools gerelateerd aan knowledge graphs in RDF:</p>



<ul class="wp-block-list">
<li><strong>Ontwerp van ontologieën</strong>: de opensourcetool <a href="https://protege.stanford.edu/">Protégé</a> wordt vaak gebruikt om ontologieën te creëren. De website <a href="https://schema.org/">Schema.org</a> biedt een groot aantal standaard schema&#8217;s en vocabulaires voor verschillende domeinen, maar wordt over het algemeen gebruikt voor knowledge graphs met betrekking tot webgegevens.</li>



<li><strong>Gegevens omzetten naar RDF</strong>: de tool <a href="https://www.w3.org/TR/r2rml/">R2RML</a> kan gebruikt worden om relationele gegevens om te zetten in RDF. Ook het vermelden waard is <a href="https://d2rq.org/">D2RQ</a>, dat toegang biedt tot een relationele database via een virtuele RDF knowledge graph.</li>



<li><strong>Dataopslag</strong>: naast de hierboven genoemde oplossingen (GraphDB en Amazon Neptune), kunnen we ook BlazeGraph en Apache Jena (opensource) vermelden, alsook Stardog en AllegroGraph (businessoplossingen).</li>



<li><strong>OWL reasoners</strong>: er bestaan veel OWL reasoners. Ze worden echter niet allemaal actief onderhouden of zijn niet altijd bruikbaar. De meest recente OWL reasoners lijst die we konden vinden dateert uit 2023 en is <a href="https://arxiv.org/pdf/2309.06888">hier</a> beschikbaar [<a href="#footnote-6">6</a>].</li>
</ul>



<p>Tot slot willen we nog het RDF4J framework (Java framework) en rdflib (python library) vermelden voor interactie met RDF data.</p>



<h2 class="wp-block-heading">Conclusie</h2>



<p>Laten we afsluiten met een korte samenvatting van de belangrijkste concepten die een wiskundige graph onderscheiden van een graph database en een knowledge graph.</p>
<p>Een wiskundige graph is een verzameling van nodes en bogen die gemakkelijk kan worden voorgesteld in matrixvorm zodat er algoritmes op kunnen worden toegepast. Het is de onderliggende structuur van elke graph database of knowledge graph.</p>
<p>Een graph database bestaat uit een set van nodes, bogen en properties. De nadruk ligt op het opslaan van grote hoeveelheden gegevens binnen een graph structuur en het optimaliseren van query&#8217;s.</p>
<p>Een knowledge graph heeft als doel om kennis binnen een graph weer te geven met de nadruk op:</p>



<ul class="wp-block-list">
<li><strong>Semantiek</strong>: de graph volgt een ontologie en relaties hebben betekenis.</li>



<li><strong>Integratie</strong>: verschillende databronnen zijn gekoppeld in een uniforme graph.</li>



<li><strong>Inferentie</strong>: het vermogen om kennis af te leiden door redeneren.</li>
</ul>



<p>Daarom is het gericht op de integratie en de semantische verrijking van data.</p>
<p>Het spreekt voor zich dat deze post slechts een tipje van de sluier oplicht van de uitgebreide literatuur over graphs en de verschillende toepassingen ervan. Vele punten moeten nog verder uitgewerkt worden en zullen ongetwijfeld het onderwerp zijn van toekomstige blogposts.</p>



<h2 class="wp-block-heading">Referenties</h2>



<p id="footnote-1">[1] <a href="/graph-db-vs-rdbms/">Graph DB vs RDBMS</a></p>
<p id="footnote-2">[2] <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">Sept (bonnes) raisons d’utiliser une Graph Database</a></p>
<p id="footnote-3">[3] <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">Les graphes de connaissance, incontournable pour l’intelligence artificielle</a></p>
<p id="footnote-4">[4] <a href="/smalls-kg-checklist/">Smals KG Checklist: déterminer si un graphe de connaissances peut résoudre un problème concret</a></p>
<p id="footnote-5">[5] Ehrlinger, L., &amp; Wöß, W. (2016). Towards a definition of knowledge graphs. SEMANTiCS 2016, 48(1-4), 2.</p>
<p id="footnote-6">[6] <a href="https://arxiv.org/pdf/2309.06888">Abitch, K., (2023). &#8220;OWL Reasoners still useable in 2023&#8221;</a></p>
<hr />
<p><em>Dit is een ingezonden bijdrage van Pierre Leleux, data scientist et network data analyst bij Smals Research. Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Graphtechnologieën, de toepassingen ervan en tools: een overzicht (deel 1)</title>
		<link>https://www.smalsresearch.be/graphtechnologieen-toepassingen-en-tools/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Thu, 20 Feb 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Knowledge Graph]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[methodology]]></category>
		<guid isPermaLink="false">/?p=21941</guid>

					<description><![CDATA[Dit eerste deel richt zich op graphs in hun fundamentele wiskundige vorm.]]></description>
										<content:encoded><![CDATA[
<p><a href="/graphes_applications_et_outils/"><em>Version française</em></a></p>



<p>Dankzij hun vermogen om complexe relaties tussen gegevens te begrijpen en te benutten, worden graphtechnologieën steeds populairder op veel gebieden van kunstmatige intelligentie en gegevensbeheer. Deze blog heeft al meerdere artikels gepubliceerd over verschillende graphtechnologieën, waaronder graph databases [<a href="#footnote-1">1</a>, <a href="#footnote-2">2</a>, <a href="#footnote-3">3</a>] en knowledge graphs [<a href="#footnote-4">4</a>, <a href="#footnote-5">5</a>, <a href="#footnote-6">6</a>].</p>
<p>Maar wat betekent de term &#8216;graph&#8217; eigenlijk? Tussen de wiskundige modellen die als basis dienen, graph databases en knowledge graphs, kan het moeilijk zijn om je weg te vinden en de tools te identificeren die het best passen bij je behoeften. Hierbij komt nog het feit dat werken met graph data op het eerste gezicht complex kan lijken en dat het gebruik van graphalgoritmes niet tot de kernvaardigheden van de meeste data engineers en data scientists behoort. Dit alles kan het creëren en exploiteren van graph data en modellen tot een ontmoedigend vooruitzicht maken.</p>
<p>Dit artikel geeft daarom een overzicht van graphtechnologieën, waarbij de drie bovengenoemde aspecten worden verkend:</p>



<ul class="wp-block-list">
<li>Graphs vanuit een theoretisch oogpunt, hun eigenschappen en hun belangrijkste toepassingen;</li>



<li>Graph databases, gespecialiseerd in de opslag en exploitatie van gekoppelde gegevens;</li>



<li>Knowledge graphs, die kennis semantisch structureren.</li>
</ul>



<p>Daarom is het de bedoeling om deze concepten en de – soms vage – grenzen ertussen te presenteren, en hun toepassingen en de bijbehorende tools en software te belichten.</p>
<p>Dit artikel is opgesplitst in twee delen. Het eerste deel richt zich op graphs in hun fundamentele wiskundige vorm, hoe ze kunnen worden gecodeerd en geëxploiteerd, en de belangrijkste algoritmes en de toepassingen ervan. Het <a href="/graphtechnologieen-toepassingen-en-tools-2/">tweede deel</a> richt zich op graph databases en knowledge graphs, en de bijbehorende tools.</p>



<h2 class="wp-block-heading">Back to basics: graphs als wiskundige structuur</h2>



<p>Laten we eerst definiëren wat een graph is. Deze theoretische basis is cruciaal aangezien de concepten van graph databases en knowledge graphs op deze basis zijn gebouwd. Deze meer geavanceerde concepten kunnen op elk moment worden teruggebracht tot hun onderliggende wiskundige vorm en bij uitbreiding zijn alle modellen en algoritmes die hieronder worden gepresenteerd toepasbaar op graph databases en knowledge graphs.</p>
<p>In zijn meest basale vorm is een graph een wiskundige structuur die bestaat uit een verzameling nodes en arcs die de nodes paarsgewijs verbinden. Nodes stellen meestal objecten of mensen voor en bogen stellen links tussen deze objecten of mensen voor. In het geval van een sociaal netwerk kan een boog bijvoorbeeld een vriendschapsband tussen twee gebruikers voorstellen.</p>
<p>De graph kan zowel gericht als ongericht zijn. In het geval van een ongerichte graph zijn de relaties tussen nodes altijd wederkerig (bijvoorbeeld een vriendschapslink op Facebook), terwijl in een gerichte graph een boog die van node i naar node j gaat, niet noodzakelijk een boog in de tegenovergestelde richting impliceert (bijvoorbeeld een website A die een link heeft naar een website B).</p>
<p>Afhankelijk van de situatie of toepassing kan een graph al dan niet gewogen zijn. Een graph is als gewogen omschreven als er aan elke boog een gewicht wordt toegekend dat varieert van boog tot boog en dat het mogelijk maakt om bepaalde bogen een grotere “kracht” te geven. De interpretatie van deze gewichten hangt af van de context; ze kunnen bijvoorbeeld een mate van verwantschap, gelijkenis, afhankelijkheid, enz. weergeven.</p>
<p>Een graph wordt over het algemeen voorgesteld door een vierkante matrix van dimensie (<em>n</em> × <em>n</em>), waarbij n het aantal nodes in de graph voorstelt, genaamd een adjacency matrix (aangeduid als <strong>A</strong>). Het element op positie (<em>i</em>, <em>j</em>) in de matrix is het gewicht van de boog van node <em>i</em> naar node <em>j</em> als deze bestaat, en anders 0 (zie figuur 1). De adjacency matrix is gewoon een binaire matrix als de graph ongewogen is.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2025/02/Adjacency.png"><img loading="lazy" decoding="async" width="1024" height="465" src="/wp-content/uploads/2025/02/Adjacency-1024x465.png" alt="" class="wp-image-21940" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/02/Adjacency-1024x465.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Adjacency-300x136.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Adjacency-768x349.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Adjacency.png 1089w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 1: Matrixvoorstelling van een gewogen gerichte graph.</figcaption></figure>



<p>Hier gaat een boog van gewicht 3 van node 1 naar node 3 en een boog van gewicht 5 in de tegenovergestelde richting. De matrix A bevat daarom de waarde 3 op positie (1,3) en de waarde 5 op positie (3,1).</p>
<p>Merk op dat adjacency matrices vaak grotendeels nullen bevatten en daarom over het algemeen worden gecodeerd met behulp van <em>sparse matrices</em> om het geheugen te optimaliseren.</p>
<p>Deze voorstelling van een graph in matrixvorm maakt het veel eenvoudiger om algoritmes op de graph te gebruiken, aangezien veel graphalgoritmes, die soms complex zijn in de vorm van vergelijkingen, vaak gereduceerd kunnen worden tot een reeks elementaire matrixbewerkingen. Dit maakt hun uitvoering zeer efficiënt in wetenschappelijke programmeertalen die geoptimaliseerd zijn voor matrixberekeningen, zoals R, MATLAB, Julia of Python (numpy, scipy).</p>



<h2 class="wp-block-heading">Gebruiken van graphalgoritmes en praktische toepassingen</h2>



<p>Om het nut van een graph beter te begrijpen, kijken we eerst naar de hoofdcategorieën van graphalgoritmes, met voor elke categorie een paar voorbeelden van het praktische gebruik ervan.</p>



<ul class="wp-block-list">
<li>Het optimale pad bepalen om een paar nodes te verbinden.</li>
</ul>



<p>Hierbij kan het gaan om het minimaliseren van het aantal overgangen dat nodig is om van de ene node naar de andere te gaan of, als er kosten zijn verbonden aan elke boog, het vinden van het pad met de laagste kosten. De kosten kunnen gedefinieerd worden als het gewicht van een boog, of gecodeerd worden in een tweede matrix (kostenmatrix, onafhankelijk van de adjacency matrix). De manier waarop de kosten van een boog worden bepaald hangt af van de toepassing, afhankelijk van wat je wilt minimaliseren. Dit kan bijvoorbeeld een maat voor de lengte van de boog zijn (de lengte van een weg), een maat voor de tijd (de tijd die nodig is om de boog over te steken) of financiële kosten. Dit type algoritme kan worden gebruikt in de logistiek om transport te optimaliseren. De bekendste algoritmes zijn de algoritmes <a href="https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm">Dijkstra</a>, <a href="https://en.wikipedia.org/wiki/A*_search_algorithm">A*</a> en <a href="https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm">Bellman-Ford</a>.</p>



<ul class="wp-block-list">
<li>Maatstaven bepalen voor gelijkenis of afstand tussen nodes in een graph.</li>
</ul>



<p>Afhankelijk van de context kan het nuttig zijn om een similariteitsmaat te bepalen tussen twee nodes in een graph om te bepalen hoe dicht ze bij elkaar liggen. Similariteitsmaten worden vaak gebruikt in aanbevelingstoepassingen. Door een consumptiegraph te ontwerpen die gebruikers koppelt aan de producten die ze hebben geconsumeerd, maakt het meten van de similariteit tussen nodes het voor een bepaalde gebruiker mogelijk om gebruikers met een gelijkaardig consumptieprofiel te identificeren, gebaseerd op hun connecties met de producten. Een product wordt meestal aanbevolen aan een gebruiker omdat het door veel vergelijkbare gebruikers is geconsumeerd (<em>user-based recommendation</em>) of omdat het product vergelijkbaar is met producten die de gebruiker al heeft geconsumeerd (<em>item-based recommendation</em>). De bekendste similariteitsmaten zijn over het algemeen gebaseerd op <em>common-neighbour</em> maten (het aantal buren dat twee nodes gemeen hebben), zoals de Jaccard-index of cosinus-similariteit, maar andere methoden houden ook rekening met indirecte buren, zoals de Katz-kernel [<a href="#footnote-12">12</a>] (ook bekend als de “von Neumann kernel”). Zie [<a href="#footnote-13">13</a>] voor enkele klassieke similariteitsmaten en het gebruik ervan in aanbevelingen.</p>
<p>Het tegenovergestelde van een similariteitsmaat is een dissimilariteitsmaat, die toeneemt naarmate twee nodes verder van elkaar verwijderd zijn. Een afstandsmaat is per definitie een dissimilariteit, omdat deze toeneemt naarmate twee nodes verder van elkaar verwijderd zijn. De bekendste en meest intuïtieve maat voor dissimilariteit tussen twee nodes is de lengte van het kortste pad tussen hen.</p>



<ul class="wp-block-list">
<li>De centraliteit meten.</li>
</ul>



<p>Een maat voor de centraliteit van een node of boog, soms ook een <em>prestige measure</em> genoemd, wordt gebruikt om te kwantificeren hoe belangrijk een node of boog is binnen een graph. De bekendste maat voor centraliteit is de score die wordt berekend door het algoritme PageRank [<a href="#footnote-14">14</a>]. PageRank werd oorspronkelijk ontwikkeld en gebruikt door de zoekmachine Google om webpagina&#8217;s te rangschikken. Het is gebaseerd op een willekeurige beweging in een graph waarin elke node een webpagina voorstelt en elke gerichte boog een hyperlink tussen twee pagina&#8217;s voorstelt. Het PageRank-algoritme kent naast het rangschikken van webpagina&#8217;s heel wat andere toepassingen:</p>
<blockquote>
<p>“Google’s PageRank method was developed to evaluate the importance of web-pages via their link structure. The mathematics of PageRank, however, are entirely general and apply to any graph or network in any domain. Thus, PageRank is now regularly used in bibliometrics, social and information network analysis, and for link prediction and recommendation. It’s even used for systems analysis of road networks, as well as biology, chemistry, neuroscience, and physics.” – <em>Gleich (2014) [<a href="#footnote-15">15</a>]</em></p>
</blockquote>
<p>Een ander bekend algoritme dat lijkt op PageRank is het HITS-algoritme (Hyperlink-Induced Topic Search) [<a href="#footnote-16">16</a>].</p>
<p>Als we het over centraliteit hebben, is PageRank vaak het algoritme dat wordt voorgesteld, maar centraliteit kan op verschillende manieren worden begrepen. Het kan bijvoorbeeld verwijzen naar een node of boog die een kritieke intermediair is voor communicatie en informatieoverdracht binnen het netwerk. Centrale nodes identificeren kan het bijvoorbeeld mogelijk maken om informatie optimaal te verspreiden in een netwerk of om nodes of bogen op te sporen die van vitaal belang zijn voor de graph (waarvan de verdwijning de informatieoverdracht in de graph ernstig zou belemmeren). Veel voorkomende maatstaven voor node- of boog-centraliteit op basis van dit principe gebruiken over het algemeen tussen-maatstaven (<em>betweenness centrality</em>).</p>
<p>Centraliteit kan ook worden beschouwd als een maat voor de representativiteit van een node binnen een gemeenschap (in termen van nabijheid tot de andere nodes in de graph), in dit geval gemeten door middel van een maat van nabijheid (<em>closeness centrality</em>). Merk op dat we het gebruik van verschillende centraliteitsalgoritmes in een fraudedetectiecontext al hebben vermeld in eerdere blogposts, met name PageRank (in de vorm van een verspreidingsalgoritme) [<a href="#footnote-7">7</a>] en betweenness centrality [<a href="#footnote-8">8</a>].</p>



<ul class="wp-block-list">
<li>De graph partitioneren.</li>
</ul>



<p>Beter bekend als “<em>clustering</em>”, bestaat graph partitioning uit het groeperen van nodes in communities (clusters) zodat nodes binnen een community “similair” zijn en twee nodes die tot verschillende communities behoren “dissimilair” zijn. Dit partitioneren kan op verschillende manieren gebeuren. Door bijvoorbeeld een maat voor similariteit of dissimilariteit tussen de nodes in de graph te gebruiken en vervolgens een clusteralgoritme zoals k-medoids uit te voeren op basis van deze (dis)similariteiten.</p>
<p>Een andere manier is om direct op de graph te werken en te proberen dichte gebieden binnen de graph te detecteren. Dit kan worden gedaan met behulp van labelpropagatie [<a href="#footnote-17">17</a>], of door het optimaliseren van een objectieve functie die de kwaliteit van de partitionering meet, zoals modulariteit. Het bekendste algoritme voor modulariteitsoptimalisatie is de Louvain-methode [<a href="#footnote-18">18</a>].</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-2.png"><img loading="lazy" decoding="async" width="508" height="444" src="/wp-content/uploads/2025/01/image-2.png" alt="" class="wp-image-21743" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-2.png 508w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-2-300x262.png 300w" sizes="auto, (max-width: 508px) 100vw, 508px" /></a><figcaption class="wp-element-caption">Figuur 2: Voorbeeld van een eenvoudige graph met 3 communities.</figcaption></figure>



<p>We hebben het gebruik van ‘graph partitioning’-methodes al genoemd in verschillende blogposts [<a href="#footnote-9">9</a>, <a href="#footnote-10">10</a>]. Deze algoritmes worden met name gebruikt in communicatie en marketing om gerichte advertenties te produceren.</p>



<ul class="wp-block-list">
<li>Kenmerken of representaties extraheren.</li>
</ul>



<p>De traditionele modellen voor <em>machine learning</em> hebben als limiet dat ze alleen rekening houden met de gegevens (continue en categorische variabelen) die betrekking hebben op de waarnemingen, en de informatie negeren die kan worden afgeleid uit de relaties tussen de waarnemingen. Indien er relaties bestaan tussen deze gegevens, kan er een graph worden geconstrueerd en kunnen de machine learning modellen worden verrijkt door nieuwe variabelen uit de graph toe te voegen (er is ook een blogpost over dit onderwerp [<a href="#footnote-11">11</a>]). Deze nieuwe variabelen kunnen bijvoorbeeld een maat voor centraliteit zijn (continue variabele) of het resultaat van partitionering (categorische variabele), of ze kunnen worden verkregen met behulp van ‘graph embedding’-methoden (continue variabelen). Graph embedding moet leiden tot een representatie van de nodes in een multidimensionale ruimte. Deze ruimte wordt zo berekend dat als twee nodes dicht bij elkaar liggen in de graph, ze ook dicht bij elkaar liggen in deze ruimte. Zo&#8217;n ruimte kan worden verkregen met methoden die direct op de graph werken (node2vec [<a href="#footnote-19">19</a>], fastRP [<a href="#footnote-20">20</a>]) of door te werken op basis van bijvoorbeeld similariteiten (kernelPCA [<a href="#footnote-21">21</a>]) of afstanden (t-SNE [<a href="#footnote-22">22</a>]). Zie figuur 3 voor een voorbeeld van een tweedimensionale weergave van een eenvoudige gewogen graph.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2025/02/Representation_NL.png"><img loading="lazy" decoding="async" width="1024" height="651" src="/wp-content/uploads/2025/02/Representation_NL-1024x651.png" alt="" class="wp-image-21939" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/02/Representation_NL-1024x651.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Representation_NL-300x191.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Representation_NL-768x489.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Representation_NL.png 1050w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 3: Weergave van een graph in een 2-dimensionale ruimte met behulp van node2vec (boven) en t-SNE (onder)</figcaption></figure>



<ul class="wp-block-list">
<li>Links voorspellen.</li>
</ul>



<p>Het concept van linkvoorspelling is relatief eenvoudig: het gaat om het inschatten van de waarschijnlijkheid dat er een link bestaat tussen twee nodes. Dit maakt het mogelijk om potentieel ontbrekende bogen (incomplete graph) te detecteren, of om het verschijnen van nieuwe bogen te voorspellen. Aanbevelingsalgoritmes zijn een veelvoorkomend voorbeeld van het voorspellen van links tussen gebruikers en producten, maar deze algoritmes kunnen ook worden gebruikt om potentiële, nog onbekende interacties binnen biologische netwerken te detecteren. Dit type voorspelling wordt vaak verricht met behulp van methoden gebaseerd op overeenkomsten tussen nodes, matrixfactorisatie, probabilistische modellen of kunstmatige neurale netwerken [<a href="#footnote-23">23</a>].</p>



<ul class="wp-block-list">
<li></li>
</ul>



<h2 class="wp-block-heading">Welke hulpmiddelen?</h2>



<p>Zoals hierboven vermeld betekent de weergave van graphs in matrixvorm dat ze efficiënt gebruikt kunnen worden in wetenschappelijke programmeertalen. Er bestaan echter ook library&#8217;s of softwares die gebruikt kunnen worden om graphs te creëren en te exploiteren.</p>
<p>Enkele voorbeelden van library&#8217;s voor het werken met graphs. Deze library&#8217;s kunnen worden gebruikt om een graph object te maken dat op verschillende manieren kan worden opgebouwd. Het kan leeg worden opgebouwd, voordat handmatig nodes en bogen worden toegevoegd, of vanuit een adjacency matrix of een lijst van bogen, of rechtstreeks vanuit bestanden die een beschrijving van de graph bevatten in de vorm van een lijst van nodes en bogen. Voorbeelden van graph-georiënteerde library’s zijn igraph, NetworkX, graph-tool of NetworKit voor Python, igraph voor R en Graphs voor Julia.</p>
<p>Voor gebruikers die al een van deze talen kennen, hebben deze library&#8217;s het voordeel dat ze intuïtief en gemakkelijk te leren zijn en veel voorgeïmplementeerde graph algoritmes bevatten.</p>



<h2 class="wp-block-heading">Conclusie</h2>



<p>In het eerste deel van deze blogpost hebben we ons toegespitst op de verschillende graph tools, we hebben de graphtheorie kort ingeleid, alsook de voornaamste toepassingen en algoritmes voor graphs. Het <a href="/graphtechnologieen-toepassingen-en-tools-2/">tweede deel</a> richt zich op graph databases en knowledge graphs, het verschil tussen deze concepten en de bijbehorende tools.</p>



<h2 class="wp-block-heading">Referenties</h2>



<p>Enkele blogposts van Smals Research over graphs:</p>
<p id="footnote-1">[1] <a href="/graph-db-vs-rdbms/">Graph DB vs RDBMS</a></p>
<p id="footnote-2">[2] <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">Sept (bonnes) raisons d’utiliser une Graph Database</a></p>
<p id="footnote-3">[3] <a href="/een-graph-database-verkennen/">Een graph database verkennen</a></p>
<p id="footnote-4">[4] <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">Les graphes de connaissance, incontournable pour l’intelligence artificielle</a></p>
<p id="footnote-5">[5] <a href="/les-graphes-de-connaissance-quelques-applications/">Les graphes de connaissance&nbsp;: quelques applications</a></p>
<p id="footnote-6">[6] <a href="/smalls-kg-checklist/">Smals KG Checklist: déterminer si un graphe de connaissances peut résoudre un problème concret</a></p>
<p id="footnote-7">[7] <a href="/un-fraudeur-ne-fraude-jamais-seul/">Un fraudeur ne fraude jamais seul</a></p>
<p id="footnote-8">[8] <a href="/un-fraudeur-ne-fraude-jamais-seul-partie-2/">Un fraudeur ne fraude jamais seul, partie 2</a></p>
<p id="footnote-9">[9] <a href="/ce-quun-reseau-social-peut-nous-apprendre/">Ce qu’un réseau social peut nous apprendre</a></p>
<p id="footnote-10">[10] <a href="/facebook-peut-on-vraiment-cacher-sa-liste-damis/">Facebook&nbsp;: peut-on vraiment cacher sa liste d’amis&nbsp;?</a></p>
<p id="footnote-11">[11] <a href="/ameliorer-le-machine-learning-avec-des-donnees-graphes/">Améliorer le Machine Learning avec des données graphes</a><br /><br />Wetenschappelijke bronnen:</p>
<p id="footnote-12">[12] Katz, L. (1953). A new status index derived from sociometric analysis. Psychometrika, 18(1), 39-43.</p>
<p id="footnote-13">[13] Fouss, F., Pirotte, A., Renders, J. M., &amp; Saerens, M. (2007). Random-walk computation of similarities between nodes of a graph with application to collaborative recommendation. IEEE Transactions on knowledge and data engineering, 19(3), 355-369.</p>
<p id="footnote-14">[14] Page, L., Brin, S., Motwani, R., &amp; Winograd, T. (1998). The pagerank citation ranking: Bringing order to the web. Technical report, Stanford Digital Libraries.</p>
<p id="footnote-15">[15] Gleich, D. F. (2015). PageRank beyond the web. siam REVIEW, 57(3), 321-363.</p>
<p id="footnote-16">[16] Kleinberg, J. M. (1999). Authoritative sources in a hyperlinked environment. Journal of the ACM (JACM), 46(5), 604-632.</p>
<p id="footnote-17">[17] Raghavan, U. N., Albert, R., &amp; Kumara, S. (2007). Near linear time algorithm to detect community structures in large-scale networks. Physical Review E—Statistical, Nonlinear, and Soft Matter Physics, 76(3), 036106.</p>
<p id="footnote-18">[18] Blondel, V. D., Guillaume, J. L., Lambiotte, R., &amp; Lefebvre, E. (2008). Fast unfolding of communities in large networks. Journal of statistical mechanics: theory and experiment, 2008(10), P10008.</p>
<p id="footnote-19">[19] Grover, A., &amp; Leskovec, J. (2016). node2vec: Scalable feature learning for networks. In Proceedings of the 22nd ACM SIGKDD international conference on Knowledge discovery and data mining (pp. 855-864).</p>
<p id="footnote-20">[20] Chen, H., Sultan, S. F., Tian, Y., Chen, M., &amp; Skiena, S. (2019, November). Fast and accurate network embeddings via very sparse random projection. In Proceedings of the 28th ACM international conference on information and knowledge management (pp. 399-408).</p>
<p id="footnote-21">[21] Schölkopf, B., &amp; Smola, A. J. (2002). Learning with kernels: support vector machines, regularization, optimization, and beyond.</p>
<p id="footnote-22">[22] Van der Maaten, L., &amp; Hinton, G. (2008). Visualizing data using t-SNE. Journal of machine learning research, 9(11).</p>
<p id="footnote-23">[23] Lü, L., &amp; Zhou, T. (2011). Link prediction in complex networks: A survey. Physica A: statistical mechanics and its applications, 390(6), 1150-1170.</p>



<hr />
<p><em>Dit is een ingezonden bijdrage van Pierre Leleux, data scientist et network data analyst bij Smals Research. Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les technologies graphes, leurs applications et leurs outils: un tour d’horizon (Partie 2)</title>
		<link>https://www.smalsresearch.be/graphes_applications_et_outils_2/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Thu, 06 Feb 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Knowledge Graph]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[methodology]]></category>
		<guid isPermaLink="false">/?p=21755</guid>

					<description><![CDATA[Cette seconde partie est consacrée aux bases de données orientées graphe et aux graphes de connaissances.]]></description>
										<content:encoded><![CDATA[
<p><a href="/graphtechnologieen-toepassingen-en-tools-2/"><em>Nederlandstalige versie</em></a></p>



<p>Cet article fait suite à la <a href="/graphes_applications_et_outils/">Partie 1</a>, qui présente les fondamentaux des technologies graphes, algorithmes et applications. Cette seconde partie est consacrée aux bases de données orientées graphe et aux graphes de connaissances, leurs différences et leurs outils.</p>



<h2 class="wp-block-heading">Les bases de données orientées graphe</h2>



<p>A l’instar d’une base de données relationnelle, l’objectif d’une base de données orientée graphe est de pouvoir stocker et gérer des données de manière persistante et d’effectuer des requêtes complexes. La différence étant que les données sont stockées sous la forme d’un graphe, à savoir un ensemble de nœuds interconnectés par le biais d’arcs.</p>
<p>Les bases de données orientées graphe ont plusieurs avantages par rapport aux bases de données relationnelles classiques, car le modèle de graphe permet une traversée simple et optimisée des données via les arcs, là où l’exploration de relations dans une base de données relationnelle peut demander un nombre important de jointures. Plus de détails sur les avantages des bases de données orientées graphe, ainsi que les cas de figure où les utiliser, se trouvent dans les articles de blog [<a href="#footnote-1">1</a>] et [<a href="#footnote-2">2</a>].</p>
<p>Les trois composants de toute base de données orientée graphe sont&nbsp;: nœuds, arcs et propriétés. Ces propriétés peuvent être placées soit sur les nœuds, soit sur les arcs, ou sur les deux. Si nous considérons le petit exemple illustratif dans la Figure 1, le nœud « Paul » peut par exemple être associé à des propriétés telles que sa date de naissance et son adresse, pour les nœuds représentant des films on peut y associer les propriétés telles que l’année de sortie, le budget et son identifiant IMDb, et sur les relations « A_VU » entre un utilisateur et un film, on pourrait associer des propriétés telles que la date de visionnage et la note (sur 5) que l’utilisateur donne au film.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-4.png"><img loading="lazy" decoding="async" width="940" height="395" src="/wp-content/uploads/2025/01/image-4.png" alt="" class="wp-image-21758" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-4.png 940w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-4-300x126.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-4-768x323.png 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></a><figcaption class="wp-element-caption">Figure 1&nbsp;: Exemple de nœuds et d’arcs avec des propriétés dans Neo4J.</figcaption></figure>



<p>Il est à noter que les algorithmes de graphe que nous avons présentés dans la <a href="/graphes_applications_et_outils/">Partie 1</a> ne sont souvent que peu ou pas implémentés dans les logiciels de bases de données orientées graphe, à quelques exceptions près (Neo4j et TigerGraph disposent d’une libraire « Graph Data Science (GDS) » contenant plusieurs algorithmes). Il est donc généralement nécessaire d’exporter le graphe (ou une partie de celui-ci) vers un outil d’analyse.</p>



<h2 class="wp-block-heading">Les outils pour bases de données orientées graphe</h2>



<p>Passons rapidement en revue quelques-uns des outils les plus connus. Notez que tous les outils listés ci-après sont compatibles avec les propriétés <a href="https://fr.wikipedia.org/wiki/Propri%C3%A9t%C3%A9s_ACID">ACID</a>. Il existe un grand nombre d’outils pour la gestion de base de données graphe, cet article n’en mentionne qu’une partie. N’hésitez pas à aller jeter un coup d’œil à une liste plus détaillée trouvable <a href="https://db-engines.com/en/ranking/graph+dbms">ici</a>.</p>
<ol>
<li>Neo4j</li>
</ol>
<p>Neo4j offre l’avantage d’avoir un format de graphe natif, ce qui rend très efficace la traversée du graphe (et donc, les requêtes). Les requêtes se font en Cypher, un langage facile à prendre en main, et Neo4J est bien documenté et dispose d’une grande communauté. Neo4J dans sa version « community » est gratuit, mais une version payante existe (Neo4j Enterprise), et la version gratuite peut poser quelques soucis de scalabilité face à de très grandes quantités de données.</p>
<ol start="2">
<li>ArangoDB</li>
</ol>
<p>ArangoDB propose un modèle de données flexible (multi-modèle), intégrant un modèle graphe, un modèle document (basé sur des objets JSON) et un modèle clé-valeur. Il dispose de son propre langage de requêtes AQL (Arango Query Language) qui peut être plus compliqué à prendre en main que Cypher en raison du multi-modèle sous-jacent à ArangoDB. C’est un logiciel payant, bien qu’une version open source existe (community edition), mais est (évidement) plus limitée que la version payante.</p>
<ol start="3">
<li>TigerGraph</li>
</ol>
<p>TigerGraph est un outil payant, optimisé pour pouvoir être utilisés sur de très grandes bases de données. Les requêtes se font via le langage GSQL, qui est un langage permettant d’effectuer de nombreuses tâches, mais plus compliqué à prendre en main que Cypher. TigerGraph dispose de nombreux algorithmes implémentés via la librairie GDS.</p>
<ol start="4">
<li>Memgraph</li>
</ol>
<p>Memgraph est un outil particulier en ce sens qu’il stocke les données directement en mémoire (dans la RAM). Cela lui permet d’avoir des très hautes performances pour le requêtage, mais en contrepartie cela rend son utilisation difficile, ou du moins coûteuse en termes d’infrastructure, lorsque le graphe est de grande taille, puisqu’il faut avoir suffisamment de RAM que pour stocker les données. Memgraph s’utilise donc généralement lorsque les performances sont la première priorité. Les requêtes se font en Cypher.</p>
<ol start="5">
<li>GraphDB</li>
</ol>
<p>GraphDB utilise un modèle de graphe bien spécifique appelé Resource Description Framework (RDF). Ce framework, qui sera discuté un peu plus en détails dans la section relative aux graphes de connaissances, a son langage de requête propre nommé SPARQL. Il existe en version gratuite open-source (graphDB Free) et en version entreprise payante (graphDB Enterprise).</p>
<ol start="6">
<li>Apache TinkerPop et ses implémentations</li>
</ol>
<p>Il s’agit d’un framework open-source qui vise à définir un modèle de base de données graphes, ainsi qu’un langage de requête nommé « Gremlin ». Il est utilisé dans de nombreux logiciels de gestion de base de données orientées graphe, tels que JanusGraph (un logiciel open-source), Amazon Neptune qui propose d’autres modèles que celui de TinkerPop tels que RDF, ou encore des outils de gestion de base de données non spécialisés en graphe, tels qu’Azure Cosmos DB.</p>



<h2 class="wp-block-heading">Les graphes de connaissances</h2>



<p>Avant de s’intéresser aux pratiques et outils, commençons dans un premier temps par définir ce qu’est un graphe de connaissances et ce qui le distingue d’une base de données orientée graphe. Il s’agit d’un graphe qui met l’accent sur la sémantique et sur l’inférence. Chaque nœud représente un concept et chaque arc une relation. Comme nous l’avons déjà vu dans les articles de blog [<a href="#footnote-3">3</a>, <a href="#footnote-4">4</a>], un graphe de connaissances se définit comme un graphe remplissant trois conditions [<a href="#footnote-5">5</a>]&nbsp;:</p>
<ol>
<li>L’intégration d’informations en provenance de différentes sources hétérogènes.</li>
</ol>
<p>Un graphe de connaissances rassemble et combine des données issues de diverses sources (structurées ou non) de manière cohérente.</p>
<ol start="2">
<li>L’utilisation d’une ontologie.</li>
</ol>
<p>Une ontologie décrit de façon formelle les concepts et les relations présentes dans le graphe, ainsi que les éventuelles contraintes et règles. Il s’agit donc d’un modèle structuré qui fournit les fondations sémantiques afin de permettre des opérations de raisonnement et des tests de cohérence. Par exemple, un schéma d’ontologie (voir Figure 2), également appelé graphe ontologique, fournit une représentation des types d&#8217;entités et des relations d’un graphe de connaissances, fournissant ainsi une structure conceptuelle sans contenir de données spécifiques.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-5.png"><img loading="lazy" decoding="async" width="872" height="559" src="/wp-content/uploads/2025/01/image-5.png" alt="" class="wp-image-21761" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-5.png 872w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-5-300x192.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-5-768x492.png 768w" sizes="auto, (max-width: 872px) 100vw, 872px" /></a><figcaption class="wp-element-caption">Figure 2&nbsp;: Exemple de schéma d’ontologie</figcaption></figure>



<ol start="3">
<li>L’inférence d’informations implicites sur base d’informations explicites.</li>
</ol>
<p>Il est possible de trouver des informations qui n’étaient pas présentes dans les données initiales sur base de règles d’inférence (Voir Figure 3).</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-6.png"><img loading="lazy" decoding="async" width="748" height="287" src="/wp-content/uploads/2025/01/image-6.png" alt="" class="wp-image-21762" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-6.png 748w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-6-300x115.png 300w" sizes="auto, (max-width: 748px) 100vw, 748px" /></a><figcaption class="wp-element-caption">Figure 3&nbsp;: Exemple d’inférence. Tiré d’un précédent <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">article de blog</a>.</figcaption></figure>



<h2 class="wp-block-heading">Un aperçu du modèle RDF (Resource Description Framework)</h2>



<p>Initialement conçu pour la description formelle de ressources web et leurs métadonnées, le modèle RDF est fréquemment utilisé pour les graphes de connaissances car il permet un raisonnement sémantique robuste et une très grande interopérabilité.</p>
<p>Un document en RDF prend la forme d’un ensemble de <strong>triplets RDF</strong>, chaque triplet est une association&nbsp;: sujet (ressource à décrire), prédicat (propriété de la ressource), objet (donnée ou autre ressource).</p>
<p>Par exemple&nbsp;:</p>
<p><code>:Alice&nbsp;:knows&nbsp;:Bob .<br />:Alice&nbsp;:livesIn&nbsp;:Paris .<br />:Alice&nbsp;:age 30 .</code></p>
<p>Ces triplets représentent donc aussi bien des relations entre nœuds (par exemple : la relation entre Alice et Bob) que des propriétés (l’âge d’Alice).</p>
<p>Une spécificité de RDF est qu’il nécessite que chaque élément d’un triplet (à l’exception de l’objet s’il s’agit d’une valeur simple, tel que la valeur 30 pour l’âge d’Alice) soit identifié par un URI (<em>Uniform Resource Identifier</em>) ou IRI (<em>Internationalized Resource Identifier</em>). Cela permet une grande interopérabilité car cela évite la création de doublons lorsque plusieurs sources d’information sont combinées. Si nous reprenons les triplets utilisés précédemment, nous obtenons le fragment suivant (en langage turtle) :</p>
<p><code>&lt;http://example.org/Alice&gt; &lt;http://example.org/knows&gt; &lt;http://example.org/Bob&gt; .<br />&lt;http://example.org/Alice&gt; &lt;http://example.org/livesIn&gt; &lt;http://example.org/Paris&gt; .<br />&lt;http://example.org/Alice&gt; &lt;http://example.org/age&gt; "30"^^&lt;http://www.w3.org/2001/XMLSchema#integer&gt; .</code></p>
<p>L&#8217;utilisation de RDF implique donc d’avoir un URI afin de pouvoir identifier tous les concepts (sujets, prédicats et objets) du graphe à l’instar d’une clé primaire dans les bases de données relationnelles.</p>
<p>De plus, il existe deux outils permettant d’ajouter de la signification sémantique aux données RDF, en décrivant les relations afin de permettre le raisonnement, à savoir RDFS (<em>RDF Schema</em>) et OWL (<em>Web Ontology Language</em>). Comme nous l’avons vu, RDF impose que chaque concept soit identifié par un URI. RDFS et OWL fournissent un ensemble prédéfini d’URI pour des concepts fréquemment utilisés, auxquels on peut faire référence dans RDF. Ceci permet d’une part d’avoir un vocabulaire commun standardisé, ce qui facilite l’intégration d’autres bases de données, et d’autre part d’établir des règles d’inférence. En effet, puisque OWL et RDFS proposent des <strong>concepts standardisés</strong>, cela permet à des « raisonneurs » basés sur OWL (tels que FaCT++ ou HermiT) d’inférer les relations implicites de façon systématique ou de détecter des contradictions, sur base de l’ontologie.</p>
<p>Les requêtes sur une base de données RDF se font via SPARQL.</p>



<h2 class="wp-block-heading">Les alternatives à RDF, et les outils pour travailler avec un graphe de connaissances</h2>



<p>Bien évidemment, un graphe de connaissances ne nécessite pas forcément l’utilisation du modèle RDF. Un graphe sera considéré comme graphe de connaissances tant que les 3 conditions décrites en début de section sur les graphes de connaissances sont remplies. Il est donc parfaitement possible de créer un graphe de connaissances dans un outil classique de gestion de base de données orientée graphe, tant que l’implémentation combine des données de plusieurs sources, qu’elle est conforme à une ontologie et qu’elle peut être utilisée pour de l’inférence sémantique.</p>
<p>La principale force du modèle RDF est son niveau de standardisation élevé. D’une part, via son exigence d’identification par URI, ainsi que son vocabulaire et son langage de requête standardisés, elle permet une haute interopérabilité. D’autre part, les extension RDFS et OWL permettent d’offrir une richesse sémantique rendant possible un raisonnement automatique. En contrepartie, sa complexité limite son adoption dans des applications business où cette rigueur sémantique n’est pas forcément nécessaire et où l’utilisation d’un modèle de graphe plus simple (tel que Neo4j ou TigerGraph) suffit. L’utilisation de modèles plus simples offre l’avantage d’être plus facile et rapide à mettre en place et d’offrir des performances de requêtage optimisées, mais au prix de la perte de la richesse sémantique offerte par RDF.</p>
<p>Cette section présente des outils (de façon non exhaustive) relatifs à RDF mais, comme mentionné, les outils précédemment cités pour les bases de données orientées graphe restent valides pour créer un graphe de connaissances tant que les <strong>conditions</strong> sont remplies.</p>
<p>Voici une liste de quelques outils liés aux graphes de connaissances en RDF :</p>
<ul>
<li><strong>La conception d’ontologies :</strong> l’outil open-source <a href="https://protege.stanford.edu/">Protégé</a> est fréquemment utilisé pour créer des ontologies. Le site <a href="https://schema.org/">schema.org</a> fournit un grand nombre de schéma et vocabulaires standards pour différents domaines, mais est généralement plutôt utilisé pour des graphes de connaissances relatifs aux données web.</li>
<li><strong>La transformation de données vers RDF :</strong> l’outil <a href="https://www.w3.org/TR/r2rml/">R2RML</a> permet de transformer des données relationnelles vers RDF. Nous pouvons aussi mentionner <a href="https://d2rq.org/">D2RQ</a>, qui donne accès à une base de données relationnelle via un graphe de connaissances RDF virtuel.</li>
<li><strong>Le stockage de données :</strong> en plus des solutions mentionnées précédemment (GraphDB et Amazon Neptune), nous pouvons aussi mentionner BlazeGraph et Apache Jena (open-source) ou encore Stardog et AllegroGraph (solutions commerciales).</li>
<li><strong>Les raisonneurs OWL :</strong> il existe de nombreux raisonneurs OWL. Tous ne sont cependant pas forcément activement maintenus ou toujours utilisables. La liste de raisonneurs OWL la plus récente que nous ayons pu trouver date de 2023 et est accessible <a href="https://arxiv.org/pdf/2309.06888">ici</a> [<a href="#footnote-6">6</a>].</li>
</ul>
<p>Terminons par mentionner le framework RDF4J (framework Java) et rdflib (libraire python) permettant d’interagir avec des données RDF.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Terminons par une rapide synthèse des concepts clés qui séparent un graphe mathématique d’une base de données orientée graphe et d’un graphe de connaissances.</p>
<p>Un graphe mathématique est un ensemble de nœuds et d’arcs facilement représentable sous forme matricielle afin d’y appliquer des algorithmes. C’est la structure sous-jacente de toute base de données orientée graphe ou graphe de connaissances.</p>
<p>Une base de données graphe comporte un ensemble de nœuds, d’arcs et de propriétés. L’accent est mis sur le stockage de grandes quantités de données au sein d’une structure graphe et sur l’optimisation du requêtage.</p>
<p>Un graphe de connaissances a pour but de représenter le savoir au sein d’un graphe mettant l’accent sur :</p>
<ul>
<li><strong>La sémantique :</strong> Le graphe suit une ontologie et les relations ont une signification.</li>
<li><strong>L’intégration :</strong> Diverses sources de données sont liées dans un graphe unifié.</li>
<li><strong>L’inférence :</strong> La capacité à dériver des connaissances via un raisonnement.</li>
</ul>
<p>Il est donc concentré sur l’intégration et l’enrichissement sémantique des données.</p>
<p>Il va sans dire que cet article ne fait qu’effleurer la surface de la vaste littérature des graphes et leurs applications diverses, et que nombreux points mériteraient un développement plus poussé et feront d’ailleurs sans doute l’objet de futurs articles.</p>



<h2 class="wp-block-heading">Références</h2>



<p id="footnote-1">[1] <a href="/graph-db-vs-rdbms/">Graph DB vs RDBMS</a></p>
<p id="footnote-2">[2] <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">Sept (bonnes) raisons d’utiliser une Graph Database</a></p>
<p id="footnote-3">[3] <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">Les graphes de connaissance, incontournable pour l’intelligence artificielle</a></p>
<p id="footnote-4">[4] <a href="/smalls-kg-checklist/">Smals KG Checklist: déterminer si un graphe de connaissances peut résoudre un problème concret</a></p>
<p id="footnote-5">[5] Ehrlinger, L., &amp; Wöß, W. (2016). Towards a definition of knowledge graphs. <i>SEMANTiCS 2016</i>, <i>48</i>(1-4), 2.</p>
<p id="footnote-6">[6] <a href="https://arxiv.org/pdf/2309.06888">Abitch, K., (2023). &#8220;OWL Reasoners still useable in 2023&#8221;</a></p>
<hr />
<p><em>Ce post est une contribution individuelle de Pierre Leleux, data scientist et network data analyst chez Smals Research. Cet article est écrit en son nom propre et n’impacte en rien le point de vue de Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les technologies graphes, leurs applications et leurs outils : un tour d’horizon (Partie 1)</title>
		<link>https://www.smalsresearch.be/graphes_applications_et_outils/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Tue, 28 Jan 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Knowledge Graph]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[methodology]]></category>
		<guid isPermaLink="false">/?p=21737</guid>

					<description><![CDATA[Cette première partie est consacrée aux graphes dans leur forme mathématique fondamentale.]]></description>
										<content:encoded><![CDATA[
<p><a href="/graphtechnologieen-toepassingen-en-tools/"><em>Nederlandstalige versie</em></a></p>



<p>Grâce à leur capacité à comprendre et exploiter les relations complexes entre les données, les technologies relatives aux graphes ont actuellement le vent en poupe, gagnant en popularité dans de nombreux domaines de l’intelligence artificielle et la gestion de données. Plusieurs articles ont d’ailleurs déjà été postés sur ce blog concernant différentes technologies de graphes, notamment sur les bases de données orientées graphe (graph database) [<a href="#footnote-1">1</a>, <a href="#footnote-2">2</a>, <a href="#footnote-3">3</a>] et les graphes de connaissances (knowledge graph) [<a href="#footnote-4">4</a>, <a href="#footnote-5">5</a>, <a href="#footnote-6">6</a>].</p>
<p>Mais que recouvre réellement le terme « graphe »&nbsp;? Entre les modèles mathématiques qui servent de fondation, les bases de données orientées graphe et les graphes de connaissances, il peut être difficile de s’y retrouver et d’identifier les outils adaptés à ses besoins. Ajoutez à cela le fait que travailler sur des données organisées en réseau peut sembler complexe à première vue et que l’utilisation d’algorithmes de graphe ne fait pas partie des compétences de base de la plupart des data engineers et data scientists, et tout cela peut rendre décourageant la création et l’exploitation de données et de modèles de graphes.</p>
<p>Cet article a donc pour objectif de faire le point sur les technologies graphes, en explorant les 3 aspects mentionnés ci-dessus&nbsp;:</p>
<ul>
<li>Les graphes d’un point de vue théorique, leurs propriétés, leurs applications principales ;</li>
<li>Les bases de données orientées graphe, spécialisées dans le stockage et l’exploitation de données connectées ;</li>
<li>Les graphes de connaissances qui structurent le savoir de manière sémantique.</li>
</ul>
<p>Le but est donc de présenter ces concepts, les frontières – parfois floues – qui les séparent, ainsi que de mettre en lumière leurs utilisations et les outils et logiciels qui y sont associés.</p>
<p>Cet article est divisé en deux parties. Cette première partie est consacrée aux graphes dans leur forme mathématique fondamentale, comment les encoder et les exploiter, ainsi qu&#8217;aux principaux algorithmes et leurs applications. La <a href="/graphes_applications_et_outils_2/">seconde partie</a> portera sur les bases de données orientées graphe et graphes de connaissances et les outils qui y sont associés.</p>



<h2 class="wp-block-heading">Retour aux fondamentaux&nbsp;: les graphes en tant que structure mathématique</h2>



<p>Avant toute chose, commençons par définir ce qu’est un graphe. Cette base théorique est cruciale car c’est dessus que se construisent les concepts de base de données orientée graphe et de graphe de connaissances. À tout moment, ces concepts plus avancés peuvent être ramenés à leur forme mathématique sous-jacente et, par extension, tous les modèles et algorithmes présentés ci-dessous sont applicables à des bases de données orientées graphe et graphes de connaissances.</p>
<p>Dans sa forme la plus fondamentale, un graphe est une structure mathématique constituée d’un ensemble de nœuds et d’arcs qui joignent des nœuds deux à deux. Les nœuds représentent typiquement des objets ou des personnes, et les arcs représentent des liens entre ces objets ou personnes. Par exemple, dans le cas d’un réseau social, un arc peut représenter un lien d’amitié entre deux utilisateurs.<br />Le graphe peut être soit dirigé soit non-dirigé. Dans le cas d’un graphe non-dirigé, les relations entre les nœuds sont toujours réciproques (par exemple, un lien d’amitié sur Facebook) alors que dans un graphe dirigé, un arc allant d’un nœud <em>i</em> à un nœud <em>j</em> n’implique pas forcément d’arc de sens opposé (par exemple, un site internet A ayant un hyperlien qui pointe vers un site B).</p>
<p>Suivant la situation ou l’application, un graphe peut aussi être pondéré ou non. Un graphe est dit pondéré lorsqu’un poids est associé à chaque arc, qui varie d’un arc à l’autre, et qui permet de donner plus de « force » à certains arcs. L’interprétation de ces poids dépend du contexte, ces poids peuvent par exemple représenter un degré d’affinité, de similarité, de dépendance, etc.</p>
<p>Un graphe est généralement représenté par une matrice carrée de dimension (<em>n</em> × <em>n</em>), où n est le nombre de nœuds du graphe, appelée matrice d’adjacence (notée <strong>A</strong>). L’élément en position (<em>i</em>, <em>j</em>) dans la matrice vaut le poids de l’arc allant du nœud <em>i</em> au nœud <em>j</em> s’il existe, et 0 sinon (voir Figure 1). La matrice d’adjacence est simplement une matrice binaire lorsque le graphe n’est pas pondéré.</p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2025/01/image-1.png"><img loading="lazy" decoding="async" width="736" height="330" src="/wp-content/uploads/2025/01/image-1.png" alt="" class="wp-image-21740" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-1.png 736w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-1-300x135.png 300w" sizes="auto, (max-width: 736px) 100vw, 736px" /></a><figcaption class="wp-element-caption">Figure 1&nbsp;: Représentation matricielle d’un graphe pondéré dirigé.</figcaption></figure>



<p>Dans l’exemple illustratif, il y a un arc de poids 3 allant du nœud 1 au nœud 3, et un arc de poids 5 allant dans le sens inverse. La matrice <strong>A</strong> contient donc la valeur 3 en position (1,3) et la valeur 5 en position (3,1).</p>
<p>Il est à noter que les matrices d’adjacence contiennent souvent une très large majorité de zéros, et sont donc généralement encodées via des matrices creuses (<em>sparse matrix</em>) afin d’optimiser la mémoire.</p>
<p>Cette représentation d’un graphe sous forme d’une matrice facilite fortement l’utilisation d’algorithmes sur le graphe, car nombre d’algorithmes de graphe, parfois complexes sous forme d’équations, peuvent souvent être résumés à une série d’opérations matricielles élémentaires. Ceci rend leur exécution très efficace dans des langages de programmation scientifiques optimisés pour les calculs matriciels, tels que R, MATLAB, Julia ou Python (numpy, scipy).</p>



<h2 class="wp-block-heading">Utilisations d’algorithmes de graphe et applications pratiques</h2>



<p>Pour mieux comprendre l’intérêt d’un graphe, commençons dans un premier temps par regarder les grandes catégories d’algorithmes de graphe, avec, pour chaque catégorie, quelques exemples d’utilisation pratique de ceux-ci.</p>
<ul>
<li>Déterminer le chemin optimal permettant de joindre une paire de nœuds.</li>
</ul>
<p>Il peut simplement s’agir de minimiser le nombre de transitions nécessaires pour passer d’un nœud à l’autre, ou alors, si un coût est associé à chaque arc, de trouver le chemin associé au coût le plus faible. Le coût peut-être défini en tant que poids d’un arc, ou encodé dans une seconde matrice (matrice de coût, indépendante de la matrice d’adjacence). La façon dont le coût d’un arc est déterminé dépend de l’application, en fonction de ce que l’on souhaite minimiser. Il peut s’agir, par exemple, d’une mesure de longueur de l’arc (telle que la longueur d’une route), une mesure de temps (le temps nécessaire pour franchir l’arc) ou un coût financier. Ce genre d’algorithme peut être utilisé en logistique pour optimiser le transport. Les algorithmes les plus connus en la matière étant les algorithmes de <a href="https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm">Dijkstra</a>, <a href="https://en.wikipedia.org/wiki/A*_search_algorithm">A*</a>, ou encore l’algorithme de <a href="https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm">Bellman-Ford</a>.</p>
<ul>
<li>Établir des mesures de similarité ou de distance entre des nœuds d’un graphe.</li>
</ul>
<p>Suivant le contexte, il peut être intéressant d’établir une mesure de similarité entre deux nœuds d’un graphe afin de déterminer à quel point ils sont proches l’un de l’autre. L’utilisation de mesures de similarité est une approche souvent utilisée dans les applications de recommandation. En construisant un graphe de consommation qui lie les utilisateurs aux produits qu’ils ont consommés, mesurer la similarité entre les nœuds permet d’identifier, pour un utilisateur donné, des utilisateurs ayant un profil de consommation similaire, en se basant sur leurs liens avec les produits. Typiquement, un produit sera recommandé à un utilisateur soit parce qu’il a été consommé par de nombreux utilisateurs similaires (<em>user-based recommendation</em>) soit car le produit est similaire à ceux déjà consommés par l’utilisateur (<em>item-based recommendation</em>). Les mesures de similarité les plus connues se basent généralement sur des mesures de voisinage commun (le nombre de voisins en commun que possèdent deux nœuds), telles que l’indice de Jaccard ou la similarité cosinus, mais d’autres méthodes permettent de prendre aussi en compte le voisinage indirect, telles que le kernel de Katz [<a href="#footnote-12">12</a>] (aussi connu sous le nom de « von Neumann kernel »). Pour voir quelques mesures de similarité classiques et leur utilisation en recommandation, voir [<a href="#footnote-13">13</a>].</p>
<p>L’opposé d’une mesure de similarité est une mesure de dissimilarité, qui augmente à mesure que les deux nœuds sont différents. Une mesure de distance est, par définition, une dissimilarité, puisqu’elle augmente lorsque deux nœuds sont éloignés. La mesure de dissimilarité la plus connue et la plus intuitive entre deux nœuds est la longueur du plus court chemin qui les sépare.</p>
<ul>
<li>Mesurer la centralité.</li>
</ul>
<p>Une mesure de centralité d’un nœud ou d’un arc, parfois aussi appelée mesure de prestige, sert à quantifier à quel point un nœud ou un arc est important au sein d’un graphe. La mesure de centralité la plus connue est, de loin, le score calculé par l’algorithme PageRank [<a href="#footnote-14">14</a>]. Initialement développé et utilisé par le moteur de recherche Google pour hiérarchiser les pages web, PageRank se base sur une marche aléatoire sur un graphe où chaque nœud représente une page web et chaque arc dirigé représente un hyperlien entre deux pages. L’algorithme PageRank trouve de nombreuses applications au-delà de la hiérarchisation de pages web&nbsp;:</p>
<blockquote>
<p style="text-align: center;">“Google’s PageRank method was developed to evaluate the importance of web-pages via their link structure. The mathematics of PageRank, however, are entirely general and apply to any graph or network in any domain. Thus, PageRank is now regularly used in bibliometrics, social and information network analysis, and for link prediction and recommendation. It’s even used for systems analysis of road networks, as well as biology, chemistry, neuroscience, and physics.” – <em>Gleich (2014) [<a href="#footnote-15">15</a>]</em></p>
</blockquote>
<p>Un autre algorithme très connu, similaire à PageRank, est l’algorithme HITS (Hyperlink-Induced Topic Search) [<a href="#footnote-16">16</a>].</p>
<p>Lorsque l’on parle de centralité, PageRank est souvent l’algorithme présenté, cependant, la centralité peut se comprendre de plusieurs manières. Il peut par exemple s’agir d’un nœud ou d’un arc constituant un intermédiaire critique pour la communication et la transmission d’information au sein du réseau. Repérer des nœuds centraux peut par exemple permettre d’optimiser la diffusion d’information dans un réseau ou de détecter des nœuds ou des arcs vitaux au graphe (dont la disparition nuirait fortement à la transmission d’information dans le graphe). Des mesures fréquentes de centralité de nœuds ou d’arcs se basant sur ce principe utilisent généralement des mesures « d’intermédiarité » (<em>betweenness centrality</em>).</p>
<p>La centralité peut aussi se comprendre comme la mesure de la représentativité d’un nœud au sein d’une communauté (en termes de proximité vis-à-vis des autres nœuds du graphe), se mesurant ici plutôt avec une mesure de proximité (<em>closeness centrality</em>). Il est à noter que nous avons déjà mentionné l’utilisation de différents algorithmes de centralité dans un cadre de détection de fraude dans des articles de blog précédents, notamment PageRank (sous forme d’un algorithme de diffusion) [<a href="#footnote-7">7</a>] et la betweenness centrality [<a href="#footnote-8">8</a>].</p>
<ul>
<li>Partitionner le graphe.</li>
</ul>
<p>Plus connu sous le nom de « <em>clustering</em> », le partitionnement de graphe consiste à regrouper des nœuds en communautés (<em>clusters</em>) tels que les nœuds au sein d’une communauté sont « similaires » et deux nœuds appartenant à des communautés différentes sont dissimilaires. Ce partitionnement peut se faire de plusieurs manières. Par exemple en utilisant une mesure de similarité ou de dissimilarité entre les nœuds du graphe, puis en exécutant un algorithme de clustering tel que le <em>k</em>-médoïdes sur base de ces (dis-)similarités.</p>
<p>Ou alors, en travaillant directement sur le graphe en cherchant à détecter des zones denses dans celui-ci. Cela peut se faire via de la propagation de label [<a href="#footnote-17">17</a>], ou via l’optimisation d’une fonction objectif mesurant la qualité du partitionnement, telle que la modularité. L’algorithme d’optimisation de la modularité le plus célèbre est la méthode de Louvain [<a href="#footnote-18">18</a>].</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-2.png"><img loading="lazy" decoding="async" width="508" height="444" src="/wp-content/uploads/2025/01/image-2.png" alt="" class="wp-image-21743" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-2.png 508w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-2-300x262.png 300w" sizes="auto, (max-width: 508px) 100vw, 508px" /></a><figcaption class="wp-element-caption">Figure 2&nbsp;: Exemple de graphe simple avec 3 communautés.</figcaption></figure>



<p>Nous avions déjà mentionné l’utilisation des méthodes de partitionnement de graphes dans plusieurs articles de blog [<a href="#footnote-9">9</a>, <a href="#footnote-10">10</a>], ces algorithmes sont utilisés notamment en communication et marketing afin de pouvoir réaliser des annonces ciblées.</p>
<ul>
<li>Extraire des caractéristiques ou des représentations.</li>
</ul>
<p>Une des limites des modèles de <em>machine learning</em> classique est qu’ils considèrent uniquement les données (variables continues et catégorielles) relatives aux observations, et ignorent l’information qui pourrait être tirée des relations entre les observations. Si des relations existent entre ces données, un graphe peut être construit, et les modèles de <em>machine learning</em> peuvent être enrichis via l’ajout de nouvelles variables extraites du graphe (il y a aussi un article de blog à ce sujet [<a href="#footnote-11">11</a>]). Ces nouvelles variables peuvent par exemple être une mesure de centralité (variable continue) ou le résultat d’un partitionnement (variable catégorielle), ou encore être obtenues via des méthodes de <em>graph embedding</em> (variables continues). Le <em>graph embedding</em> vise à obtenir une représentation des nœuds dans un espace multidimensionnel. Cet espace est calculé de sorte que, si deux nœuds sont proches dans le graphe, ils le seront aussi dans cet espace. Cet espace peut par exemple s’obtenir via des méthodes travaillant directement sur le graphe (node2vec [<a href="#footnote-19">19</a>], fastRP [<a href="#footnote-20">20</a>]) ou en travaillant sur base de similarités (kernelPCA [<a href="#footnote-21">21</a>]) ou de distances (t-SNE [<a href="#footnote-22">22</a>]) par exemple. Voir Figure 3 pour un exemple de représentation en 2 dimensions d&#8217;un graphe pondéré simple.</p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2025/01/image-3.png"><img loading="lazy" decoding="async" width="940" height="596" src="/wp-content/uploads/2025/01/image-3.png" alt="" class="wp-image-21744" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-3.png 940w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-3-300x190.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-3-768x487.png 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></a><figcaption class="wp-element-caption">Figure 3&nbsp;: Représentation d’un graphe dans un espace à 2 dimensions via node2vec (haut) et t-SNE (bas)</figcaption></figure>



<ul>
<li>Prédire des liens.</li>
</ul>
<p>Le concept de prédiction de lien est relativement explicite, il s’agit d’estimer la probabilité qu’un lien existe entre 2 nœuds. Cela permet de détecter des potentiels arcs manquants (graphe incomplet), ou de prédire l’apparition de nouveaux arcs. Les algorithmes de recommandations sont un exemple courant de prédiction de lien utilisateur-produit, mais ces algorithmes peuvent aussi servir à détecter des potentielles interactions encore inconnues à l’intérieur de réseaux biologiques. Ce genre de prédiction se fait souvent via des méthodes basées sur des similarités entre nœuds, de la factorisation matricielle, des modèles probabilistes ou des réseaux de neurones artificiels [<a href="#footnote-23">23</a>].</p>



<h2 class="wp-block-heading">Quels outils&nbsp;?</h2>



<p>Comme mentionné précédemment, la représentation de graphes sous forme matricielle permet de les exploiter de façon efficace via des langages de programmation scientifiques. Cependant, il existe aussi des librairies ou logiciels permettant de créer et exploiter des données de graphe.</p>
<p>Voici quelques exemples de librairies dédiées au travail sur les graphes. Ces librairies permettent de créer un objet graphe, qui peut être construit de plusieurs manières. Il peut être construit à vide, avant d’y ajouter manuellement des nœuds et des arcs, ou alors à partir d’une matrice d’adjacence ou d’une liste d’arcs, ou bien encore directement depuis des fichiers contenant une description du graphe sous la forme d’une liste de nœuds et d’arcs. Quelques exemples de librairies orientées graphe incluent igraph, networkx, graph-tool ou networkit pour Python, igraph pour R et Graphs pour Julia.</p>
<p>Pour un utilisateur ayant déjà des connaissances dans l’un de ces langages, ces libraires ont l’avantage d’être intuitives et faciles à prendre en main, et contiennent de nombreux algorithmes de graphe pré-implémentés.</p>
<p>Il existe aussi de nombreux logiciels prévus pour l’analyse du contenu de bases de données orientées graphe, tels que Gephi ou Cytoscape (pour une liste plus détaillée, nous vous invitons à vous référer à l’un de nos précédents articles sur le sujet&nbsp;: [<a href="#footnote-3">3</a>]). Il s’agit bien de logiciels créés pour des analyses ponctuelles ou des explorations visuelles des relations dans des ensembles de données, mais qui ne sont pas conçus pour intégrer et gérer de grandes quantités de données de manière continue comme le ferait une base de données orientée graphe.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Dans la première partie de cet article dédié aux différentes technologies basées sur les graphes, nous avons fait une rapide présentation de la théorie des graphes, ainsi que des principaux algorithmes de graphe et leurs applications. La <a href="/graphes_applications_et_outils_2/">seconde partie</a> se penchera sur les bases de données orientées graphe et les graphes de connaissances, les différences entre ces concepts ainsi que les outils qui y sont associés.</p>



<h2 class="wp-block-heading">Références</h2>



<p>Quelques articles de blog Smals Research concernant les graphes&nbsp;:</p>
<p id="footnote-1">[1] <a href="/graph-db-vs-rdbms/">Graph DB vs RDBMS</a></p>
<p id="footnote-2">[2] <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">Sept (bonnes) raisons d’utiliser une Graph Database</a></p>
<p id="footnote-3">[3] <a href="/explorer-une-base-de-donnees-orientee-graphes/">Explorer une base de données orientée graphes</a></p>
<p id="footnote-4">[4] <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">Les graphes de connaissance, incontournable pour l’intelligence artificielle</a></p>
<p id="footnote-5">[5] <a href="/les-graphes-de-connaissance-quelques-applications/">Les graphes de connaissance&nbsp;: quelques applications</a></p>
<p id="footnote-6">[6] <a href="/smalls-kg-checklist/">Smals KG Checklist: déterminer si un graphe de connaissances peut résoudre un problème concret</a></p>
<p id="footnote-7">[7] <a href="/un-fraudeur-ne-fraude-jamais-seul/">Un fraudeur ne fraude jamais seul</a></p>
<p id="footnote-8">[8] <a href="/un-fraudeur-ne-fraude-jamais-seul-partie-2/">Un fraudeur ne fraude jamais seul, partie 2</a></p>
<p id="footnote-9">[9] <a href="/ce-quun-reseau-social-peut-nous-apprendre/">Ce qu’un réseau social peut nous apprendre</a></p>
<p id="footnote-10">[10] <a href="/facebook-peut-on-vraiment-cacher-sa-liste-damis/">Facebook&nbsp;: peut-on vraiment cacher sa liste d’amis&nbsp;?</a></p>
<p id="footnote-11">[11] <a href="/ameliorer-le-machine-learning-avec-des-donnees-graphes/">Améliorer le Machine Learning avec des données graphes</a></p>
<p> </p>
<p>Sources scientifiques&nbsp;:</p>
<p id="footnote-12">[12] Katz, L. (1953). A new status index derived from sociometric analysis. Psychometrika, 18(1), 39-43.</p>
<p id="footnote-13">[13] Fouss, F., Pirotte, A., Renders, J. M., &amp; Saerens, M. (2007). Random-walk computation of similarities between nodes of a graph with application to collaborative recommendation. IEEE Transactions on knowledge and data engineering, 19(3), 355-369.</p>
<p id="footnote-14">[14] Page, L., Brin, S., Motwani, R., &amp; Winograd, T. (1998). The pagerank citation ranking: Bringing order to the web. Technical report, Stanford Digital Libraries.</p>
<p id="footnote-15">[15] Gleich, D. F. (2015). PageRank beyond the web. siam REVIEW, 57(3), 321-363.</p>
<p id="footnote-16">[16] Kleinberg, J. M. (1999). Authoritative sources in a hyperlinked environment. Journal of the ACM (JACM), 46(5), 604-632.</p>
<p id="footnote-17">[17] Raghavan, U. N., Albert, R., &amp; Kumara, S. (2007). Near linear time algorithm to detect community structures in large-scale networks. Physical Review E—Statistical, Nonlinear, and Soft Matter Physics, 76(3), 036106.</p>
<p id="footnote-18">[18] Blondel, V. D., Guillaume, J. L., Lambiotte, R., &amp; Lefebvre, E. (2008). Fast unfolding of communities in large networks. Journal of statistical mechanics: theory and experiment, 2008(10), P10008.</p>
<p id="footnote-19">[19] Grover, A., &amp; Leskovec, J. (2016). node2vec: Scalable feature learning for networks. In Proceedings of the 22nd ACM SIGKDD international conference on Knowledge discovery and data mining (pp. 855-864).</p>
<p id="footnote-20">[20] Chen, H., Sultan, S. F., Tian, Y., Chen, M., &amp; Skiena, S. (2019, November). Fast and accurate network embeddings via very sparse random projection. In Proceedings of the 28th ACM international conference on information and knowledge management (pp. 399-408).</p>
<p id="footnote-21">[21] Schölkopf, B., &amp; Smola, A. J. (2002). Learning with kernels: support vector machines, regularization, optimization, and beyond.</p>
<p id="footnote-22">[22] Van der Maaten, L., &amp; Hinton, G. (2008). Visualizing data using t-SNE. Journal of machine learning research, 9(11).</p>
<p id="footnote-23">[23] Lü, L., &amp; Zhou, T. (2011). Link prediction in complex networks: A survey. <em>Physica A: statistical mechanics and its applications</em>, <em>390</em>(6), 1150-1170.</p>
<hr />
<p><em>Ce post est une contribution individuelle de Pierre Leleux, data scientist et network data analyst chez Smals Research. Cet article est écrit en son nom propre et n’impacte en rien le point de vue de Smals.</em></p>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Een graph database verkennen</title>
		<link>https://www.smalsresearch.be/een-graph-database-verkennen/</link>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Thu, 11 Jan 2024 08:50:49 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">/?p=19768</guid>

					<description><![CDATA[Sinds 2017 vestigen we op deze pagina's de aandacht op het gebruik van Graph Databases (hier, hier en hier). Gartner voorspelt dat in 2025 de graph-technologieën zullen worden gebruikt in 80% van de innovaties in het gebied van data en analytics, tegenover 10% in 2021, waardoor snelle besluitvorming in een organisatie mogelijk wordt. ]]></description>
										<content:encoded><![CDATA[
<p><a href="/explorer-une-base-de-donnees-orientee-graphes/" data-type="post" data-id="19580"><em>Version en français</em></a></p>



<p>Sinds 2017 vestigen we op deze pagina&#8217;s de aandacht op het gebruik van Graph Databases (<a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations/">hier</a>, <a href="/graph-db-vs-rdbms/">hier</a> en <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">hier</a>). <a href="https://www.gartner.com/en/newsroom/press-releases/2021-03-16-gartner-identifies-top-10-data-and-analytics-technologies-trends-for-2021">Gartner voorspelt dat in 2025</a> de graph-technologieën zullen worden gebruikt in 80% van de innovaties in het gebied van data en analytics, tegenover 10% in 2021, waardoor snelle besluitvorming in een organisatie mogelijk wordt.&nbsp;</p>



<p>Graph databases worden in twee grote domeinen gebruikt:</p>



<ul class="wp-block-list">
<li>Analytics, waarbij complexe berekeningen worden uitgevoerd op grote hoeveelheden gegevens (identificatie van structuren, gemeenschappen, karakteristieke nodes, ontbrekende relaties, anomalieën, paths, enz.);</li>



<li>Verkenning, waarbij agenten kunnen zoeken naar een bepaalde node of relatie en vervolgens de directe omgeving ervan kunnen verkennen in een onderzoekscontext.</li>
</ul>



<p>Het is natuurlijk gebruikelijk om de twee te combineren: een eerste analysefase identificeert situaties die moeten worden onderzocht (vermoedelijke fraude, incidenten of zwakheden in een infrastructuur, etc.), en elk geval kan dan lokaal worden verkend om tot een beslissing te komen. Verder in dit artikel zullen we ons richten op het verkennende aspect.&nbsp;</p>



<p>In de verkennende fase ligt een van de belangrijkste voordelen van graph databases in het feit dat het datamodel en de echte wereld goed op mekaar kunnen afgestemd worden. Over het algemeen vertegenwoordigen de nodes of entiteiten concepten die duidelijk zijn voor businessmensen (mensen, bedrijven, documenten, servers, etc.) en hebben de relaties een natuurlijke semantiek (werkt voor, behoort tot, is verbonden met, etc.). Als gevolg hiervan kan een generieke grafische interface vaak worden gekoppeld aan een database en in handen worden gegeven van experts zonder IT-kennis, met slechts een beetje configuratie en parametrisatie vooraf, maar geen ontwikkeling. Dit zal niet het geval zijn in relationele databases, waar <a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations/">een tabel zowel een entiteit als een relatie kan vertegenwoordigen, en een attribuut soms echte informatie zal vertegenwoordigen, en soms een primaire of vreemde sleutel (foreign key)</a>.</p>



<p><a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">Knowledge graphs</a> zijn een typisch voorbeeld van een algemene grafische interface die veel toegevoegde waarde kan bieden zonder dat er specifieke ontwikkeling voor nodig is.</p>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image-2.png"><img loading="lazy" decoding="async" width="834" height="313" src="/wp-content/uploads/2023/12/image-2.png" alt="" class="wp-image-19655" style="width:200px" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/image-2.png 834w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-2-300x113.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-2-768x288.png 768w" sizes="auto, (max-width: 834px) 100vw, 834px" /></a></figure>



<p>Om deze mogelijkheid te illustreren bestuderen we hieronder een aantal tools, van de eenvoudigste tot de meest complexe, die kunnen worden gebruikt om gegevens te visualiseren die zijn opgeslagen in een <a href="https://neo4j.com/">Neo4J</a> graph-georiënteerde database.&nbsp;&nbsp;</p>



<h1 class="wp-block-heading">JavaScript libraries</h1>



<p>Er bestaan veel libraries die een netwerk kunnen weergeven (<a href="https://visjs.org/">vis.js</a>, <a href="https://d3js.org/">D3</a>, <a href="https://www.sigmajs.org/">Sigma.js</a>, &#8230;). Maar sommige stellen je in staat om rechtstreeks te interageren met Neo4j. Zo kun je in JavaScript een Cypher query (de querytaal van Neo4j) hebben, dat naar de Neo4j-server wordt gestuurd en waarvan het resultaat op het scherm kan worden weergegeven:</p>



<ul class="wp-block-list">
<li><a href="https://github.com/neo4j-contrib/neovis.js/">Neovis.js</a> (uitbreiding van vis.js, gratis);</li>



<li><a href="https://github.com/Nhogs/popoto">Popoto.js</a> (uitbreiding van D3.js, gratis);</li>



<li><a href="https://cytoscape.org/">Cytoscape.js</a>, waarschijnlijk de meest geavanceerde opensource library, aanvulling op CytoScape Desktop, die hieronder aan bod komt;</li>



<li><a href="https://cambridge-intelligence.com/keylines/">KeyLines</a>, zeer geavanceerde commerciële oplossing voor bedrijven.</li>
</ul>



<p>Deze oplossingen voldoen niet direct aan de hierboven genoemde mogelijkheid van een tool die enkel geconfigureerd hoeft te worden, omdat ze veel ontwikkelingswerk vereisen voordat ze in productie kunnen worden genomen. Anderzijds maakt het feit dat ze rechtstreeks met Neo4j kunnen communiceren de ontwikkeling ongetwijfeld eenvoudiger, maar impliceert ook dat directe toegang tot Neo4j vanuit de browser beschikbaar moet zijn, en dat de informatie voor de connectie aanwezig is in de JavaScript-code, of wordt opgevraagd bij de gebruiker.</p>



<h1 class="wp-block-heading">Ingestion</h1>



<p>Met een groot aantal producten kun je Neo4j-gegevens opnemen in je eigen datasysteem, ofwel door alle gegevens eruit te halen of door een Cypher query uit te voeren om het resultaat op te halen.</p>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image-5.png"><img loading="lazy" decoding="async" width="506" height="196" src="/wp-content/uploads/2023/12/image-5.png" alt="" class="wp-image-19688" style="width:200px" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/image-5.png 506w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-5-300x116.png 300w" sizes="auto, (max-width: 506px) 100vw, 506px" /></a></figure>



<p>Er zijn bijvoorbeeld twee opensource tools voor netwerkanalyse:&nbsp;</p>



<ul class="wp-block-list">
<li><a href="https://gephi.org/">Gephi</a>, met een toegewezen plugin. Er is keuze tussen het importeren van alle nodes en relaties die behoren tot één of meerdere geselecteerde types, of alleen het resultaat van een Cypher query. Helaas is het proces nogal moeizaam en vereist het een goede kennis van Cypher, wat deze oplossing ongeschikt maakt voor gebruik door een businessexpert. Het is bijvoorbeeld nodig om een query op te geven met de nodes die geïmporteerd moeten worden, gevolgd door een andere query met de relaties. Het zal daarom bijzonder complex zijn om het hele netwerk binnen een maximale afstand van 3 van een “doel”-node te importeren.<br>Bovendien worden de gegevens na het importeren volledig losgekoppeld van de database. Tenzij ze opnieuw worden geïmporteerd, is het niet mogelijk om de buren van een node in de werkruimte op te vragen.</li>
</ul>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image-6.png"><img loading="lazy" decoding="async" width="653" height="249" src="/wp-content/uploads/2023/12/image-6.png" alt="" class="wp-image-19689" style="width:200px" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/image-6.png 653w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-6-300x114.png 300w" sizes="auto, (max-width: 653px) 100vw, 653px" /></a></figure>



<ul class="wp-block-list">
<li><a href="https://cytoscape.org/">Cytoscape</a>, met een toegewijde plugin (Cytoscape Neo4j Plugin). Op papier is dit een geavanceerdere oplossing dan Gephi: gegevensintegratie via een query is veel flexibeler en zodra een deel van het netwerk is geïmporteerd, kun je met slechts twee klikken zoeken naar de buren van een node in de werkruimte. Dit is dus een echte verkenningstool. Er zijn echter drie beperkingen:
<ul class="wp-block-list">
<li>Tijdens onze tests werden de nodes correct geïmporteerd, maar de relaties niet en werden deze zeer willekeurig geïmporteerd;</li>



<li>Een visualisatie kan niet verrijkt worden met een nieuwe query (die een nieuwe visualisatie creëert), wat de interactiviteit aanzienlijk beperkt;</li>



<li>Cytoscape is eigenlijk een tool ontworpen voor bio-informatica en chemie. Hoewel het zeer krachtig is, is het ook complex en moeilijk in handen te leggen van niet-technische gebruikers.</li>
</ul>
</li>
</ul>



<p>Naast deze opensource oplossingen zijn er een groot aantal professionele en commerciële platforms met zeer uitgebreide analysemogelijkheden, die zich richten op een &#8216;graph&#8217; benadering en waarmee een groot aantal gegevensformaten kan worden geïmporteerd, waaronder Neo4j. Over het algemeen bedoeld voor organisaties (veiligheid, intelligence, enz.) met onderzoeksbehoeften, dupliceren ze daarom Neo4j gegevens (wat synchronisatie bemoeilijkt) en combineren ze deze mogelijk met andere gegevens. Bijvoorbeeld (<a href="https://neo4j.com/developer-blog/15-tools-for-visualizing-your-neo4j-graph-database/">meer details hier</a>)&nbsp;:</p>



<ul class="wp-block-list">
<li><a href="https://graphaware.com/products/hume/">Hume (GraphAware)</a></li>



<li><a href="https://virtualitics.com/">Virtualitics</a></li>



<li><a href="https://www.kineviz.com/">Kineviz GraphXR</a></li>



<li><a href="https://siren.io/">Siren</a></li>



<li><a href="https://www.graphistry.com/">Graphistry</a></li>
</ul>



<h1 class="wp-block-heading">Exploratie</h1>



<p>Laten we nu eens kijken naar een aantal toepassingen waarmee je direct kan aansluiten op een Neo4j database om deze te verkennen, zonder de gegevens te kopiëren naar een intern systeem, en zonder dat er enige ontwikkeling voor nodig is, althans in het begin.</p>



<p>Eerst is er het basistool dat (gratis) wordt meegeleverd met Neo4j: <a href="https://neo4j.com/developer/neo4j-browser/" target="_blank" rel="noreferrer noopener">Neo4j Browser</a>. Dit is een tool voor ontwikkelaars en datawetenschappers, waarmee ze queries kunnen testen en de resultaten kunnen bekijken, met beperkte uitbreidingsmogelijkheden (weergave van de buren van een node). Je moet altijd beginnen met een Cypher-query en je kunt een node alleen uitbreiden door alle buren weer te geven.</p>



<h2 class="wp-block-heading">Neo4j Bloom</h2>



<p><a href="https://neo4j.com/product/bloom/">Neo4j Bloom</a> is een (betalende) optie van de Enterprise versie van Neo4j (ook betalend), en is een tool voor business experts. Ze kunnen zoeken naar informatie in &#8216;full text&#8217;, selectief uitbreiden (alleen buren van een bepaald type toevoegen, of gekoppeld via een relatie van een bepaald type), en zelfs grafisch &#8216;patterns&#8217; definiëren om naar te zoeken, zonder dat er ook maar één regel Cypher voor nodig is.</p>



<p>Bloom is gratis beschikbaar met Neo4j Desktop (lokaal geïnstalleerde versie), maar alleen voor het verkennen van lokale graphs, en zonder de mogelijkheid om visualisaties op te slaan, waardoor deze gratis versie ongeschikt is voor gebruik in een professionele context.</p>



<h2 class="wp-block-heading">yWorks Neo4j Explorer</h2>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image-1.png"><img loading="lazy" decoding="async" width="212" height="55" src="/wp-content/uploads/2023/12/image-1.png" alt="" class="wp-image-19654" style="width:200px"/></a></figure>



<p>Ontwikkeld door hetzelfde bedrijf als yFiles en yEd, biedt <a href="https://www.yworks.com/neo4j-explorer/">yWorks Neo4j Explorer</a> een eenvoudige interface (gratis), die full text zoeken, selectieve uitbreiding en zelfs de mogelijkheid biedt om ChatGPT te gebruiken voor het genereren van een Cypher query voor een specifieke behoefte. Er is echter geen echte mogelijkheid om een visualisatie op te slaan of te delen.</p>



<p>yWorks Explorer kan gebruikt worden door de <a href="https://www.yworks.com/neo4j-explorer/">cloudversie </a>te kiezen of door het te installeren in Neo4j Desktop. Merk op dat in de cloudversie, de verbinding met de database wordt gemaakt vanuit de browser, en het dus mogelijk is om toegang te krijgen tot een interne of lokale database.</p>



<h2 class="wp-block-heading">Graphileon</h2>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image.png"><img loading="lazy" decoding="async" width="250" height="125" src="/wp-content/uploads/2023/12/image.png" alt="" class="wp-image-19653" style="width:200px"/></a></figure>



<p><a href="https://graphileon.com/">Graphileon</a>, of het nu cloud (betaalversie) of desktop (gratis, maar gedeprecieerd) is, is op dit moment nog niet echt toegankelijk voor iedereen, omdat het een Cypher query als startpunt vereist. Maar het biedt wel de mogelijkheid om een &#8216;app&#8217; te creëren, waarmee ontwikkelaars knoppen aan de interface kunnen toevoegen met een geprogrammeerde actie, waardoor de functionaliteit wordt uitgebreid. De mogelijkheden van de tool zijn echter relatief beperkt en vereisen vaak technische vaardigheden, zoals de noodzaak om JavaScript te bewerken om stijlen aan te passen (kleuren, vormen, icoontjes, enz.).</p>



<p>Het extra voordeel is de scheiding tussen een &#8216;admin&#8217;-gebruiker, die de verbinding met de DB configureert, en de &#8216;klassieke&#8217; gebruiker, die geen technische informatie over de database hoeft te kennen.</p>



<h2 class="wp-block-heading">Tom Sawyer Graph Database Browser</h2>



<figure class="wp-block-image alignright is-resized"><img loading="lazy" decoding="async" width="205" height="60" src="/wp-content/uploads/2023/12/image-7.png" alt="Tom Sawyer Software" class="wp-image-19702" style="width:200px"/></figure>



<p>Van zo&#8217;n softwareleverancier had je misschien een tool verwacht die vergelijkbaar is met de concurrenten die op deze pagina worden gepresenteerd, maar Neo4j&#8217;s verkenning is helemaal anders. Een verouderde interface, stijl parametriseringsopties die JavaScript-achtige codebewerking vereisen, Cypher queries als het enige startpunt, geen full text search (behalve voor objecten die al in de werkruimte staan), geen selectieve uitbreiding… Als het een gratis tool was geweest, had het een geldig alternatief kunnen zijn, maar <a href="https://www.tomsawyer.com/graph-database-browser">Tom Sawyer Graph Database Browser</a> biedt alleen betaalde opties. De waarde van deze leverancier zit ongetwijfeld in de andere producten in de catalogus.</p>



<h2 class="wp-block-heading">Linkurious Enterprise</h2>



<figure class="wp-block-image alignright size-large is-resized"><a href="/wp-content/uploads/2023/12/image-3.png"><img loading="lazy" decoding="async" width="1024" height="158" src="/wp-content/uploads/2023/12/image-3-1024x158.png" alt="" class="wp-image-19656" style="width:200px" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/image-3-1024x158.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-3-300x46.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-3-768x119.png 768w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-3-1536x238.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-3-2048x317.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Naar onze mening de meest geavanceerde van de tot nu toe geteste tools. Voor eindgebruikers biedt <a href="https://linkurious.com/">Linkurious Enterprise</a> een eenvoudig te hanteren interface voor leken, krachtige zoek-, filter- en stijlaanpassingsmogelijkheden en visualisaties die kunnen worden opgeslagen, georganiseerd, gedeeld, geëxporteerd of becommentarieerd. Admins kunnen het beheer van gebruikers, groepen en toegangsrechten verfijnen en eventueel koppelen aan AD of LDAP. </p>



<p>Het is jammer dat er geen tool is zoals die van Bloom, waarmee (relatief) uitgebreide queries kunnen worden gebouwd zonder kennis van Cypher. Maar dit wordt gecompenseerd door de mogelijkheid voor admins om Cypher queries te definiëren, eventueel met parameters, waardoor gebruikers krachtige zoekopdrachten of uitbreidingen kunnen uitvoeren, zonder enige technische kennis.</p>



<p>Een geavanceerde API maakt ook een hoge mate van automatisering mogelijk. Het is bijvoorbeeld mogelijk om automatisch een weergave te maken en vervolgens een &#8216;widget&#8217; (interactieve mini-weergave) te maken die vervolgens in een toepassing kan worden geïntegreerd.</p>



<p>In tegenstelling tot de meeste tools die in dit artikel worden genoemd, is er geen gratis versie van Linkurious, zelfs geen beperkte.</p>



<h2 class="wp-block-heading">Graphlytic</h2>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image-4.png"><img loading="lazy" decoding="async" width="893" height="219" src="/wp-content/uploads/2023/12/image-4.png" alt="" class="wp-image-19657" style="width:200px" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/image-4.png 893w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-4-300x74.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-4-768x188.png 768w" sizes="auto, (max-width: 893px) 100vw, 893px" /></a></figure>



<p>Waarschijnlijk het enige echte alternatief voor Bloom of Linkurious, biedt <a href="https://graphlytic.com/">Graphlytic </a>een gratis versie, via Neo4j Desktop of on-premise, maar met één gebruiker. We zitten echter nog steeds een niveau lager qua mogelijkheden: beperkte samenwerkingsaspecten, geen echte selectieve exploratie, geen parametrische queries.</p>



<p>Er is echter een Query builder, die nog steeds beperkt is maar potentieel heeft, de mogelijkheid om de stijl (nodegrootte, kleuren, randstijlen en -dikte, pijlvormen, enz.) zeer gedetailleerd aan te passen en de aanwezigheid van de API of verbinding met een SSO (niet getest).</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p>Er bestaan dus een aantal alternatieven voor gegevensverkenning in Neo4j (en vaak ook andere modellen zoals MemGraph of AllegroGraph). Deze variëren van eenvoudige, gratis tools binnen het bereik van kleine organisaties, zoals yWorks of Graphlytic, tot veel uitgebreidere oplossingen, maar tegen prijzen die alleen grote organisaties zich kunnen veroorloven, zoals Bloom of Linkurious. Maar bij de keuze van een geschikte tool moet er ook rekening gehouden worden met een aantal criteria waarmee die niet in detail werden besproken: wat is het pricing model, is de tool compatibel met de software en netwerkinfrastructuur van het bedrijf, hoe zit het met GDPR, enz.</p>



<p>Een eerste evaluatie met een gratis tool zal al deze beperkingen aan het licht brengen, om zo met kennis van zaken de ideale tool te kunnen kiezen.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><span style="color: #999999;">Deze post is een individuele bijdrage van Vandy Berten, gespecialiseerd in data science bij Smals Research. Dit artikel is geschreven onder zijn eigen naam en weerspiegelt op geen enkele wijze de standpunten van Smals.<em>.</em></span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Explorer une base de données orientée graphes</title>
		<link>https://www.smalsresearch.be/explorer-une-base-de-donnees-orientee-graphes/</link>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Fri, 08 Dec 2023 15:28:47 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">/?p=19580</guid>

					<description><![CDATA[Depuis 2017, nous mettons en avant dans ces pages (ici, là, ou encore ici) l'utilisation de bases de données orientées graphes (ou Graph Databases). Gartner prédit que d'ici 2025, les technologies graphes seront utilisées dans 80 % des innovations en données et analytique, contre 10 % en 2021, facilitant la prise de décision rapide au travers d'une organisation.]]></description>
										<content:encoded><![CDATA[
<p><em><a href="/een-graph-database-verkennen/" data-type="post" data-id="19768">Nederlandstalige versie</a></em></p>



<p>Depuis 2017, nous mettons en avant dans ces pages (<a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations/">ici</a>, <a href="/graph-db-vs-rdbms/">là</a>, ou encore <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">ici</a>) l&#8217;utilisation de bases de données orientées graphes (ou Graph Databases). <a href="https://www.gartner.com/en/newsroom/press-releases/2021-03-16-gartner-identifies-top-10-data-and-analytics-technologies-trends-for-2021">Gartner prédit que d&#8217;ici 2025</a>, les technologies graphes seront utilisées dans 80 % des innovations en données et analytique, contre 10 % en 2021, facilitant la prise de décision rapide au travers d&#8217;une organisation. </p>



<p>Les bases de données graphes ont deux grandes familles d&#8217;application&nbsp;:</p>



<ul class="wp-block-list">
<li>L&#8217;analytique, dans laquelle des calculs complexes sont effectués sur de grands volumes de données (identification de structures, de communautés, de nœuds caractéristiques, de relations manquantes, d&#8217;anomalies, de chemins&#8230;) ;</li>



<li>L&#8217;exploration, permettant à des agents de rechercher un nœud ou une relation particulière, pour ensuite explorer son voisinage proche dans un contexte d&#8217;investigation.</li>
</ul>



<p>Il est bien sûr fréquent de combiner les deux&nbsp;: une première phase d&#8217;analytique permet d&#8217;identifier des situations à examiner (suspicion de fraude, d&#8217;incident ou de faiblesse dans une infrastructure&#8230;), chaque cas pouvant ensuite être exploré localement pour prendre une décision. Dans la suite de cet article, nous allons nous focaliser sur l&#8217;aspect exploratoire.&nbsp;</p>



<p>Dans la phase exploratoire, un des avantages majeurs des bases de données orientées graphe est la proximité forte entre le modèle de données et le monde réel. Généralement, les nœuds ou entités vont représenter des concepts clairs pour les gens de métier (personnes, entreprises, documents, serveurs&#8230;) et les relations auront une sémantique naturelle (travaille pour, appartient à, est connecté à&#8230;). Ce qui a pour conséquence qu&#8217;une interface graphique générique peut souvent être connectée à une base de données et mise dans les mains d&#8217;experts sans connaissances IT, avec uniquement un peu de configuration et paramétrisation au préalable, mais pas de développement. Ceci ne sera pas vrai dans les bases de données relationnelles, ou <a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations/" data-type="post" data-id="10493">une table peut autant représenter une entité qu&#8217;une relation, et attribut représentera tantôt une réelle information, tantôt une clé primaire ou étrangère</a>.</p>



<p>Les <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">Knowledge graphs</a> sont typiquement un exemple où une interface graphique générique pourra offrir une grande plus-value sans nécessiter de développement spécifique.</p>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image-2.png"><img loading="lazy" decoding="async" width="834" height="313" src="/wp-content/uploads/2023/12/image-2.png" alt="" class="wp-image-19655" style="width:200px" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/image-2.png 834w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-2-300x113.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-2-768x288.png 768w" sizes="auto, (max-width: 834px) 100vw, 834px" /></a></figure>



<p>Pour illustrer cette possibilité, nous allons parcourir un certain nombre d&#8217;outils, des plus simples aux plus élaborés, qui permettent de visualiser des données stockées dans une base de données orientée graphe <a href="https://neo4j.com/">Neo4J</a>.&nbsp;</p>



<h1 class="wp-block-heading">Librairies JavaScript</h1>



<p>Il existe de nombreuses librairies capables d&#8217;afficher un réseau (<a href="https://visjs.org/">vis.js</a>, <a href="https://d3js.org/">D3</a>, <a href="https://www.sigmajs.org/">Sigma.js</a>, &#8230;). Mais certaines permettent directement d&#8217;interagir avec Neo4j. On peut donc avoir, dans le JavaScript, une requête Cypher (le langage de requêtes de Neo4j), qui sera envoyée au serveur Neo4j, et dont le résultat pourra être affiché à l&#8217;écran&nbsp;:</p>



<ul class="wp-block-list">
<li><a href="https://github.com/neo4j-contrib/neovis.js/">Neovis.js</a> (Extension de vis.js, gratuit) ;</li>



<li><a href="https://github.com/Nhogs/popoto">popoto.js</a> (Extension de D3.js, gratuit) ;</li>



<li><a href="https://cytoscape.org/">Cytoscape.js</a>, probablement la librairie open-source la plus évoluée, compagnon de CytoScape Desktop que nous évoquerons plus bas ;</li>



<li><a href="https://cambridge-intelligence.com/keylines/">KeyLines</a>, solution commerciale très évoluée à destination des entreprises.</li>
</ul>



<p>Ces solutions ne répondent pas directement à la possibilité évoquée ci-dessus d&#8217;un outil qu&#8217;il suffit de paramétrer, puisqu&#8217;elles nécessitent des développements importants avant une mise en production. Par ailleurs, le fait qu&#8217;elles puissent communiquer directement avec Neo4j rend sans doute les développements plus faciles, mais implique aussi qu&#8217;un accès direct à Neo4j depuis le navigateur est ouvert, et que les informations de connexion sont présentes dans le code JavaScript, ou demandées à l&#8217;utilisateur.</p>



<h1 class="wp-block-heading">Ingestion</h1>



<p>Une large gamme de produits permettent d&#8217;ingérer des données Neo4j dans leur propre système de données, soit en aspirant la totalité des données, soit en exécutant une requête Cypher pour en récupérer le résultat.</p>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image-5.png"><img loading="lazy" decoding="async" width="506" height="196" src="/wp-content/uploads/2023/12/image-5.png" alt="" class="wp-image-19688" style="width:200px" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/image-5.png 506w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-5-300x116.png 300w" sizes="auto, (max-width: 506px) 100vw, 506px" /></a></figure>



<p>Nous pouvons par exemple citer deux outils open-source destinés à de l&#8217;analyse réseaux&nbsp;:&nbsp;</p>



<ul class="wp-block-list">
<li><a href="https://gephi.org/">Gephi</a>, avec un plugin dédié. On a le choix entre l&#8217;importation de la totalité des nœuds et relations appartenant à un ou des type(s) sélectionné(s), ou uniquement le résultat d&#8217;une requête Cypher. Le processus est malheureusement assez laborieux et nécessite de bonnes connaissances de Cypher, ce qui ne permet pas de mettre cette solution dans les mains d&#8217;un expert métier. Il est par exemple nécessaire de fournir une requête listant les nœuds à importer, puis une autre requête listant les relations. Il sera de fait particulièrement complexe d&#8217;importer l&#8217;ensemble du réseau à une distance de maximum 3 d&#8217;un nœud &#8220;cible&#8221;.<br>Par ailleurs, une fois les données importées, elle seront complètement découplées de la base de données. Il ne sera pas possible, à moins d&#8217;un nouvel import, de récupérer les voisins d&#8217;un nœud présent dans l&#8217;espace de travail.</li>
</ul>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image-6.png"><img loading="lazy" decoding="async" width="653" height="249" src="/wp-content/uploads/2023/12/image-6.png" alt="" class="wp-image-19689" style="width:200px" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/image-6.png 653w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-6-300x114.png 300w" sizes="auto, (max-width: 653px) 100vw, 653px" /></a></figure>



<ul class="wp-block-list">
<li><a href="https://cytoscape.org/">Cytoscape</a>, avec un plugin dédié (Cytoscape Neo4j Plugin). Sur le papier, il s&#8217;agit d&#8217;une solution plus avancée que celle de Gephi&nbsp;: l&#8217;intégration des données via une requête est beaucoup plus souple, et une fois qu&#8217;une partie du réseau est importée, on peut en deux clics aller chercher les voisins d&#8217;un nœud présent dans l&#8217;espace de travail. On a donc un véritable outil d&#8217;exploration. Néanmoins, trois limitations sont à noter&nbsp;:
<ul class="wp-block-list">
<li>Lors de nos tests, si les nœuds étaient correctement importés, ça n&#8217;était pas le cas des relations, importées de façon très aléatoire ;</li>



<li>On ne peut pas enrichir une visualisation avec une nouvelle requête (qui créera une nouvelle visualisation), ce qui limite fortement l&#8217;interactivité ;</li>



<li>Cytoscape est à la base un outil conçu pour la bioinformatique et la chimie. S&#8217;il est extrêmement puissant, il est également complexe, et difficile à mettre dans les mains d&#8217;utilisateurs peu techniques.</li>
</ul>
</li>
</ul>



<p>En dehors de ces solutions open-source, il existe un grand nombre de plateformes professionnelles et commerciales, aux possibilités d&#8217;analyse très étendues, se focalisant sur une approche &#8220;graphe&#8221; et permettant d&#8217;importer un grand nombre de formats de données, dont Neo4j. En général à destination d&#8217;organisation (sécurité, renseignement&#8230;) ayant des besoins d&#8217;investigation, elles dupliqueront donc les données de Neo4j (compliquant la synchronisation) et les combineront potentiellement à d&#8217;autres. On peut par exemple citer (<a href="https://neo4j.com/developer-blog/15-tools-for-visualizing-your-neo4j-graph-database/">plus de détails ici</a>)&nbsp;:</p>



<ul class="wp-block-list">
<li><a href="https://graphaware.com/products/hume/">Hume (GraphAware)</a></li>



<li><a href="https://virtualitics.com/">Virtualitics</a></li>



<li><a href="https://www.kineviz.com/">Kineviz GraphXR</a></li>



<li><a href="https://siren.io/">Siren</a></li>



<li><a href="https://www.graphistry.com/">Graphistry</a></li>
</ul>



<h1 class="wp-block-heading">Exploration</h1>



<p>Intéressons-nous maintenant à des applications qui permettront directement de se connecter à une base de données Neo4j pour l&#8217;explorer, sans copier les données dans un système interne, et sans demander de développement, du moins dans un premier temps.</p>



<p>Citons tout d&#8217;abord l&#8217;outil de base fourni (gratuitement) avec Neo4j&nbsp;: <a href="https://neo4j.com/developer/neo4j-browser/" target="_blank" rel="noreferrer noopener">Neo4j Browser</a>. Il s&#8217;agit d&#8217;un outil à destination des développeurs ou data-scientists, permettant de tester des requêtes et d&#8217;en visualiser le résultat, avec des possibilités d&#8217;expansion (affichage des voisins d&#8217;un nœud) limitées. Il faut toujours commencer par une requête Cypher, et on ne peut étendre un nœud qu&#8217;en affichant la totalité de ses voisins.</p>



<h2 class="wp-block-heading">Neo4j Bloom</h2>



<p><a href="https://neo4j.com/product/bloom/">Neo4j Bloom</a> est une option (payante) de la version Enterprise de Neo4j (payante aussi), il s&#8217;agit là d&#8217;un véritable outil à destination d&#8217;experts métier. Il pourront rechercher des informations en &#8220;full text&#8221;, étendre sélectivement (ajouter uniquement les voisins d&#8217;un certain type, ou lié via une relation d&#8217;un certain type), et même définir graphiquement des &#8220;patterns&#8221; à rechercher, sans nécessiter la moindre ligne de Cypher. </p>



<p>Bloom est disponible gratuitement avec Neo4j Desktop (version installée localement), mais uniquement pour explorer des graphes locaux, et sans possibilités de sauvegarder ses visualisations, rendant cette version gratuite peu compatible avec une utilisation dans un contexte professionnel.</p>



<h2 class="wp-block-heading">yWorks Neo4j Explorer</h2>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image-1.png"><img loading="lazy" decoding="async" width="212" height="55" src="/wp-content/uploads/2023/12/image-1.png" alt="" class="wp-image-19654" style="width:200px"/></a></figure>



<p>Développé par la même société que yFiles ou yEd, <a href="https://www.yworks.com/neo4j-explorer/">yWorks Neo4j Explorer</a> offre (gratuitement) une interface simple, permettant une recherche full-text, une expansion sélective et offre même la possibilité d&#8217;utiliser ChatGPT pour générer une requête Cypher répondant à un besoin spécifique. On regrettera cependant ne pas y trouver de réelle possibilité de sauvegarder ou de partager une visualisation.</p>



<p>On peut utiliser yWorks Explorer soit en utilisant la <a href="https://www.yworks.com/neo4j-explorer/">version cloud</a>, soit en l&#8217;installant dans Neo4j Desktop. Il est à noter que dans la version cloud, la connexion à la base de données se fait depuis le navigateur, et qu&#8217;il est donc possible d&#8217;accéder à une base de données interne ou locale.</p>



<h2 class="wp-block-heading">Graphileon</h2>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image.png"><img loading="lazy" decoding="async" width="250" height="125" src="/wp-content/uploads/2023/12/image.png" alt="" class="wp-image-19653" style="width:200px"/></a></figure>



<p><a href="https://graphileon.com/">Graphileon</a>, version cloud (payant) ou desktop (gratuite, mais est dépréciée) n&#8217;est à ce stade pas réellement accessible à tous, parce qu&#8217;elle nécessite une requête Cypher comme point de départ. Mais on offre la possibilité de créer une &#8220;app&#8221;, permettant à des développeurs de rajouter des boutons à l&#8217;interface ayant une action programmée, ce qui étendra les fonctionnalités. Les possibilités de l&#8217;outil sont cependant relativement limitées, nécessitant par ailleurs souvent des compétences techniques, comme la nécessité d&#8217;éditer du JavaScript pour modifier les styles (couleurs, formes, icônes&#8230;).</p>



<p>Le petit plus est la séparation entre un utilisateur &#8220;admin&#8221;, qui configure la connexion à la DB, et l&#8217;utilisateur &#8220;classique&#8221;, qui n&#8217;a ainsi pas besoin de connaître les informations techniques de la base de données.</p>



<h2 class="wp-block-heading">Tom Sawyer Graph Database Browser</h2>



<figure class="wp-block-image alignright is-resized"><img loading="lazy" decoding="async" width="205" height="60" src="/wp-content/uploads/2023/12/image-7.png" alt="Tom Sawyer Software" class="wp-image-19702" style="width:200px"/></figure>



<p>De la part d&#8217;un tel éditeur de logiciel, on aurait pu s&#8217;attendre à un outil comparable à ses concurrents présentés sur cette page, mais en ce qui concerne l&#8217;exploration de Neo4j, il n&#8217;en est rien. Une interface vieillotte, des possibilités de paramétrisation des styles nécessitant d&#8217;éditer un code à la JavaScript, des requêtes Cypher comme seul point de départ, pas de recherche full-text (à part dans objets déjà présents dans l&#8217;espace de travail), pas d&#8217;expansion sélective&#8230; S&#8217;il s&#8217;agissait d&#8217;un outil gratuit, il aurait pu constituer une alternative valable, mais <a href="https://www.tomsawyer.com/graph-database-browser">Tom Sawyer Graph Database Browser</a> ne propose que des options payantes. La valeur de cet éditeur est sans doute à trouver dans les autres produits de son catalogue.</p>



<h2 class="wp-block-heading">Linkurious Enterprise</h2>



<figure class="wp-block-image alignright size-large is-resized"><a href="/wp-content/uploads/2023/12/image-3.png"><img loading="lazy" decoding="async" width="1024" height="158" src="/wp-content/uploads/2023/12/image-3-1024x158.png" alt="" class="wp-image-19656" style="width:200px" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/image-3-1024x158.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-3-300x46.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-3-768x119.png 768w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-3-1536x238.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-3-2048x317.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>À notre sens le plus évolué des outils testés jusqu&#8217;ici. Pour les utilisateurs finaux, <a href="https://linkurious.com/">Linkurious Enterprise</a> propose une interface facile à prendre en main pour les non-initiés, des possibilités puissantes de recherche, de filtrage ou de personnalisation des styles ; des visualisations qui peuvent être sauvegardées, organisées, partagées, exportées ou commentées. Pour les administrateurs, la possibilité de gérer finement les utilisateurs, groupes, droits d&#8217;accès, en les liant potentiellement à un AD ou LDAP. </p>



<p>On regrettera l&#8217;absence d&#8217;un outil tel que celui proposé par Bloom, permettant de construire des requêtes (relativement) élaborées sans nécessiter la connaissance de Cypher. Mais ceci est compensé par la possibilité pour les administrateurs de définir des requêtes Cypher, éventuellement paramétriques, permettant aux utilisateurs des recherches ou extensions puissantes, sans connaissances techniques.</p>



<p>Une API  avancée permet par ailleurs une grande automatisation. On peut par exemple créer automatiquement une visualisation, pour en créer ensuite un &#8220;widget&#8221; (mini-vue interactive) que l&#8217;on pourra ensuite intégrer dans une application.</p>



<p>Contrairement à la majorité des outils cités dans cet article, il n&#8217;existe pas de version gratuite de Linkurious, même limitée.</p>



<h2 class="wp-block-heading">Graphlytic</h2>



<figure class="wp-block-image alignright size-full is-resized"><a href="/wp-content/uploads/2023/12/image-4.png"><img loading="lazy" decoding="async" width="893" height="219" src="/wp-content/uploads/2023/12/image-4.png" alt="" class="wp-image-19657" style="width:200px" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/image-4.png 893w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-4-300x74.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/12/image-4-768x188.png 768w" sizes="auto, (max-width: 893px) 100vw, 893px" /></a></figure>



<p>Sans doute la seule réelle alternative à Bloom ou Linkurious, on aura avec <a href="https://graphlytic.com/">Graphlytic </a>une version gratuite, soit via Neo4j Desktop, soit en on-premise, mais avec un seul utilisateur. On reste cependant un niveau en dessous en termes de possibilités&nbsp;: aspects collaboratifs limités, pas vraiment d&#8217;exploration sélective, pas de requêtes paramétriques. </p>



<p>On notera cependant un &#8220;Query builder&#8221;, encore limité mais avec du potentiel, la possibilité de personnaliser le style (taille de nœuds, couleurs, styles et épaisseur de bords, formes de flèches&#8230;) de façon fine, la présence du API ou la connexion à une SSO (non testés).</p>



<h1 class="wp-block-heading">Conclusions</h1>



<p>Il existe donc un certain nombre d&#8217;alternatives permettant l&#8217;exploration de données dans Neo4j (ainsi que, souvent, d&#8217;autres modèles comme MemGraph ou AllegroGraph). Cela va d&#8217;outils simples et gratuits à la portée de petites organisations, comme yWorks ou Graphlytic, à des solutions beaucoup plus élaborées, mais à des prix que seules des grosses structures peuvent s&#8217;offrir, comme Bloom ou Linkurious. Mais il faudra bien sûr tenir compte d&#8217;un ensemble de critères non détaillés ici ; quel est le modèle de &#8220;<em>pricing&#8221;</em>, l&#8217;outil est-il compatible avec l&#8217;infrastructure logicielle et réseau de l&#8217;entreprise, qu&#8217;en est-il par rapport au GDPR&#8230;</p>



<p>Une première évaluation avec un outil gratuit permettra de mettre en évidence toutes ces contraintes, de sorte de choisir l&#8217;outil idéal en toute connaissance de cause.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><span style="color: #999999;"><em>Ce post est une contribution individuelle de Vandy Berten, spécialisé&nbsp;</em>en<em>&nbsp;data science&nbsp;chez Smals Research. Cet article est écrit en son nom propre et n’impacte en rien le point de vue de Smals.</em></span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Améliorer le Machine Learning avec des données graphes</title>
		<link>https://www.smalsresearch.be/ameliorer-le-machine-learning-avec-des-donnees-graphes/</link>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 06 Sep 2022 08:51:28 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<guid isPermaLink="false">/?p=17658</guid>

					<description><![CDATA[Obtenir un crédit auprès d&#8217;une banque est parfois un parcours du combattant. Une banque accepte à certaines conditions, une autre rejette la demande, une troisième encore consent à des conditions différentes de la première. Deux personnes ayant le même salaire, les mêmes avoirs en épargne et demandant le même montant peuvent obtenir des réponses différentes. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Obtenir un crédit auprès d&#8217;une banque est parfois un parcours du combattant. Une banque accepte à certaines conditions, une autre rejette la demande, une troisième encore consent à des conditions différentes de la première. Deux personnes ayant le même salaire, les mêmes avoirs en épargne et demandant le même montant peuvent obtenir des réponses différentes.</p>
<p><em>Avertissement&nbsp;: la suite est un exemple pédagogique visant à illustrer le principe du &#8220;machine learning&#8221;. Il ne se veut pas exact par rapport au fonctionnement du monde bancaire.</em></p>
<p>Une méthode qui pourrait aider la banque à faire son choix serait, à l&#8217;aide d&#8217;experts du crédit, de développer un &#8220;arbre de décision&#8221;&nbsp;: si le requérant a un salaire en CDI de plus de x% du remboursement mensuel, compter le nombre de défaut de payement des autres crédits. Si ce montant est inférieur à Y, accorder le crédit. Sinon, si le montant moyen de ses comptes d&#8217;épargne est supérieur à Z, accorder également, etc.<a href="/wp-content/uploads/2022/08/2022-08-29_09h36_58.png"><img loading="lazy" decoding="async" class="alignleft size-medium wp-image-17660" src="/wp-content/uploads/2022/08/2022-08-29_09h36_58-300x122.png" alt="" width="300" height="122" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/08/2022-08-29_09h36_58-300x122.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/08/2022-08-29_09h36_58.png 412w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Définir un tel arbre peut être complexe, et parfois arbitraire, mais relèverait de la &#8220;programmation (informatique) traditionnelle&#8221;&nbsp;: on fournit à un ordinateur un programme (l&#8217;arbre de décision avec toutes ses branches, ses conditions et ses seuils) et des données (le montant du crédit demandé, le salaire, les avoirs, le montant des autres crédits en cours&#8230;), et il fournira un &#8220;output&#8221; (accorder ou non le crédit).</p>
<p> </p>
<h1>Programmation traditionnelle vs Machine Learning</h1>
<p>Une approche plus puissante est d&#8217;utiliser l&#8217;apprentissage machine, ou &#8220;machine learning&#8221;. Le principe de base consiste à fournir à l&#8217;ordinateur un grand nombre de données sur le passé (appelées observations), concernant les crédits déjà accordés par la banque, puis de lui fournir le résultat (ou un &#8220;label&#8221;), à savoir le fait que le client ait pu ou non rembourser son crédit (on pourrait être plus fin en définissant des catégories&nbsp;: &#8220;a remboursé son crédit sans difficulté&#8221;, &#8220;a eu entre A et B retards de payements&#8221;, &#8230;, &#8220;a été en défaut de payement&#8221;). Sur base de ceci, le <em>machine learning</em> consiste à entraîner l&#8217;ordinateur pour qu&#8217;il soit capable de produire un programme qui pourra, sur base des données d&#8217;une future demande, prédire si oui ou non le client remboursera ses dettes.<a href="/wp-content/uploads/2022/08/2022-08-29_09h59_17.png"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-17661" src="/wp-content/uploads/2022/08/2022-08-29_09h59_17-300x125.png" alt="" width="300" height="125" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/08/2022-08-29_09h59_17-300x125.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/08/2022-08-29_09h59_17.png 405w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Les données en question, on peut les voir comme un grand tableau, avec une ligne par crédit accordé par le passé (observation), et une colonne pour chaque donnée, que l&#8217;on appelle &#8220;<em>feature</em>&#8221; ou &#8220;variable&#8221;: le montant du crédit, le salaire, le montant des autres crédits, le nombre de retard de payements&#8230; et peut-être aussi des <em>features</em> moins avouables (le genre du/de la client(e), ou le montant des dépenses en pharmacies dans les 6 derniers mois&#8230;). On peut très bien ajouter des <em>features</em> sans savoir si elles auront un quelconque impact sur le résultat, et laisser l&#8217;ordinateur le découvrir. </p>
<p>Pour être plus précis, l&#8217;ordinateur ne va pas créer un programme &#8220;à partir de rien&#8221;: on va en fait choisir un algorithme de machine learning (Decision Tree, Random Forest, Gradiant Boosting&#8230;) et l&#8217;entrainement permettra de choisir les paramètres de l&#8217;algorithme (qui peuvent être plusieurs milliers, voire plusieurs millions dans le cas de la &#8220;deep learning&#8221;, une des familles les plus récentes des algorithmes de machine learning). Cet algorithme &#8220;paramétré&#8221; pourra ensuite être utilisé en production lorsqu&#8217;une nouvelle demande de crédit sera soumise à la banque.<a href="/wp-content/uploads/2022/09/2022-09-16_08h44_39.png"><img loading="lazy" decoding="async" class="alignright wp-image-17755 size-full" src="/wp-content/uploads/2022/09/2022-09-16_08h44_39.png" alt="" width="1399" height="546" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/09/2022-09-16_08h44_39.png 1399w, https://www.smalsresearch.be/wp-content/uploads/2022/09/2022-09-16_08h44_39-300x117.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/09/2022-09-16_08h44_39-768x300.png 768w, https://www.smalsresearch.be/wp-content/uploads/2022/09/2022-09-16_08h44_39-1024x400.png 1024w" sizes="auto, (max-width: 1399px) 100vw, 1399px" /></a></p>
<p> </p>
<h1>Classification, regression, clustering</h1>
<p>L&#8217;exemple que nous avons donné ci-dessus illustre les algorithmes de &#8220;<strong>classification</strong>&#8221;&nbsp;: à partir des données d&#8217;entrée (<em>features</em>) associées à des labels connus, on entraîne le modèle à déterminer une catégorie, ou une classe, pour un nouvel arrivant&nbsp;: &#8220;accorder le crédit&#8221;, &#8220;refuser le crédit&#8221;. Il est aussi possible d&#8217;utiliser un algorithme de <strong>régression</strong>: à partir des <em>features</em> et des labels, déterminer une valeur numérique (montant à accepter, taux du crédit&#8230;). Ces deux groupes (classifications et régression) font partie de la famille des <strong>méthodes supervisées</strong>, parce qu&#8217;un résultat attendu (le label) est fourni pour les données d&#8217;entrainement. </p>
<p>Il existe aussi une famille de<strong> méthodes non-supervisées</strong>, lorsqu&#8217;on ne fournit pas de label. On parle principalement de &#8220;<strong>clustering</strong>&#8220;, le but étant d&#8217;arriver à déterminer automatique des groupes de clients (dans notre cas) ayant des caractéristiques similaires.</p>
<p><a href="/wp-content/uploads/2022/08/2022-08-29_10h45_50.png"><img loading="lazy" decoding="async" class="size-full wp-image-17664 aligncenter" src="/wp-content/uploads/2022/08/2022-08-29_10h45_50.png" alt="" width="1021" height="319" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/08/2022-08-29_10h45_50.png 1021w, https://www.smalsresearch.be/wp-content/uploads/2022/08/2022-08-29_10h45_50-300x94.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/08/2022-08-29_10h45_50-768x240.png 768w" sizes="auto, (max-width: 1021px) 100vw, 1021px" /></a></p>
<h1>Avec des graphes&nbsp;?</h1>
<p>Dans ce blog (voir par exemple <a href="/un-fraudeur-ne-fraude-jamais-seul-partie-2/">ici</a> ou <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-3-3/">ici</a>), nous avons souvent montré la puissance de l&#8217;analyse réseau, qui consiste à ne plus considérer les données comme des individus ayant chacun un certain nombre de caractéristiques, mais comme des entités liées entre elles par des relations. Dans notre cas, on pourrait considérer un modèle simple avec des comptes bancaires et des personnes, les relations entre comptes bancaires représentant les transactions, et celles entre personnes et comptes, l&#8217;appartenance. On peut facilement ensuite enrichir le modèle avec les domiciles des personnes et les numéros de téléphones, comme illustré ci-dessous.</p>
<p><a href="/wp-content/uploads/2022/08/2022-08-29_11h45_43.png"><img loading="lazy" decoding="async" class="alignright size-full wp-image-17665" src="/wp-content/uploads/2022/08/2022-08-29_11h45_43.png" alt="" width="1006" height="334" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/08/2022-08-29_11h45_43.png 1006w, https://www.smalsresearch.be/wp-content/uploads/2022/08/2022-08-29_11h45_43-300x100.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/08/2022-08-29_11h45_43-768x255.png 768w" sizes="auto, (max-width: 1006px) 100vw, 1006px" /></a></p>
<p>Cette (nouvelle) façon de voir le problème permet de donner des perspectives supplémentaires à notre analyse. Voici quelques méthodes permettant d&#8217;augmenter les performances de notre moteur de décision. </p>
<h1>Pattern based features</h1>
<p>En analyse réseau, on identifie souvent des &#8220;<em>patterns</em>&#8220;, ou des schémas, qui sont pertinents, spécifiquement pour le business étudié. On pourrait par exemple imaginer qu&#8217;une transaction entre deux personnes domiciliées à la même adresse ne doit pas être considérée de la même façon qu&#8217;entre deux personnes non-apparentées. On pourrait dès lors exclure ces montants &#8211; qui peuvent être vus comme des mouvements d&#8217;équilibrage internes entre les membres d&#8217;un même foyer &#8211; des dépenses totales du client. Dans un langage comme &#8220;Cypher&#8221; (le langage de requêtage de la <a href="/graph-db-vs-rdbms/" target="_blank" rel="noopener">base de données graph Neo4j</a>), une telle transaction &#8220;t&#8221; pour un client &#8220;c&#8221; serait identifiée comme telle: </p>
<p><span style="color: #008000;">(c:Client)</span><span style="color: #0000ff;">-[:OWNS]-&gt;</span><span style="color: #008000;">(:BankAccount)</span><span style="color: #0000ff;">-[t:TRANSFERS]-&gt;</span><span style="color: #008000;">(:BankAccount)</span><span style="color: #0000ff;">&lt;-[:OWNS]-</span><span style="color: #008000;">(:Client)</span><span style="color: #0000ff;">-[:LIVES_AT]-&gt;</span><span style="color: #008000;">(:Address)</span><span style="color: #0000ff;">&lt;-[:LIVES_AT]-</span><span style="color: #008000;">(c)</span></p>
<p>Dans cet exemple, &#8220;<span style="color: #008000;">(c:Client)</span>&#8221; désigne un nœud de type &#8220;Client&#8221;, nommé &#8220;c&#8221;, identique au dernier nœud du pattern ; et <span style="color: #0000ff;">-[:OWNS]-&gt;</span> désigne l&#8217;appartenance d&#8217;un compte à une personne.</p>
<p>Cette description correspond au chemin ci-dessous&nbsp;: </p>
<p><a href="/wp-content/uploads/2022/09/2022-09-06_10h41_11.png"><img loading="lazy" decoding="async" class="size-full wp-image-17686 aligncenter" src="/wp-content/uploads/2022/09/2022-09-06_10h41_11.png" alt="" width="693" height="248" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/09/2022-09-06_10h41_11.png 693w, https://www.smalsresearch.be/wp-content/uploads/2022/09/2022-09-06_10h41_11-300x107.png 300w" sizes="auto, (max-width: 693px) 100vw, 693px" /></a></p>
<p>Dans le secteur de la lutte contre la fraude, on pourrait être intéressé par les personnes ayant effectué des virements vers des personnes ayant été convaincues de fraude par le passé, voire vers personnes vivant à la même adresse que des personnes négativement connues&nbsp;: </p>
<ul>
<li><span style="color: #008000;">(c:Client)</span><span style="color: #0000ff;">-[:OWNS]-&gt;</span><span style="color: #008000;">(:BankAccount)</span><span style="color: #0000ff;">-[:TRANSFERS]-&gt;<span style="color: #008000;">(:BankAccount)</span>&lt;-[:OWNS]-</span><span style="color: #008000;">(:Client {isFraudster:True})</span></li>
<li><span style="color: #008000;">(c:Client)</span><span style="color: #0000ff;">-[:OWNS]-&gt;</span><span style="color: #008000;">(:BankAccount)</span><span style="color: #0000ff;">-[:TRANSFERS]-&gt;</span><span style="color: #008000;">(:BankAccount)</span><span style="color: #0000ff;">&lt;-[:OWNS]-</span><span style="color: #008000;">(:Client)</span><span style="color: #0000ff;">-[:LIVES_AT]-&gt;</span><span style="color: #008000;">(:Address)</span><span style="color: #0000ff;">&lt;-[:LIVES_AT]-</span><span style="color: #008000;">(:Client {isFraudster:True})</span></li>
</ul>
<p>Où <span style="color: #008000;">(:Client {isFraudster:True}) <span style="color: #000000;">désigne un nœud de type &#8220;Client&#8221; ayant un attribut &#8220;isFraudster&#8221; de valeur &#8220;True&#8221;.</span></span></p>
<p>Sur base de ces patterns, on peut ajouter des nouvelles <em>features</em> aux données décrites plus haut dans cet article, soit booléennes (existe-t-il pour ce client des transactions vers des clients &#8220;fraudeurs&#8221;), soit numérique (fréquence des &#8220;auto-transferts&#8221;, ou ratio entre ceux-ci et les autres). Il n&#8217;est de nouveau pas nécessaire d&#8217;être sûr que la valeur soit corrélée avec le risque de défaut de payement&nbsp;: on laissera aux algorithmes de machine learning le soin de découvrir si elle est pertinente ou non.</p>
<h1>Graph based features</h1>
<p>L&#8217;avantage des méthodes décrites dans la section précédente est qu&#8217;elles permettent de rajouter des <em>features</em> qui sont très pertinentes et spécifiquement sélectionnées pour le domaine en question. La contrepartie est qu&#8217;elles peuvent être difficiles à identifier et à implémenter. Il existe cependant de nombreux algorithmes génériques pour les graphes, qui peuvent s&#8217;appliquer à très faibles coût, tout en proposant des métriques pertinentes. En particulier, les différentes <a href="/un-fraudeur-ne-fraude-jamais-seul-partie-2/" target="_blank" rel="noopener">méthodes de calcul de centralité</a> (<em>degree centrality, betweenness centrality, closeness centrality, PageRank&#8230;) </em>donnent à chaque nœud (ou à chaque nœud d&#8217;un type spécifique) une valeur numérique qui peut être utilisée comme <em>feature</em>.</p>
<p>D&#8217;un autre côté, les méthodes de détection de communauté (<em>Louvain, Label Propagation&#8230;</em>) attribuent une catégorie (ou une communauté) à chaque nœud.  On peut l&#8217;utiliser directement, si l&#8217;algorithme de machine learning supporte les <em>features</em> catégoriques, ou indirectement, en comptant par exemple le ratio entre les transferts entre comptes appartenant à la même communauté et ceux des communautés distinctes.</p>
<p>Les algorithmes plus courts chemins peuvent également être pertinents&nbsp;: on peut par exemple considérer la distance du client à un client fraudeur, ou en défaut chronique de payement, si l&#8217;on part du postulat, certes moralement discutable, qu&#8217;une personne a plus de chances d&#8217;être en défaut de payement si elle est entourées de nombreuses personnes chroniquement en défaut de payement.</p>
<p>Notons que ces méthodes se servent en général uniquement de la topologie du réseau, et pas des attributs (ou éventuellement d&#8217;uniquement un attribut désignant un &#8220;poids&#8221; ou une distance). Toute la connaissance n&#8217;est donc pas utilisée.</p>
<h1>Graph embeddings</h1>
<p>En dehors des méthodes qui peuvent fournir des métriques dont la sémantique est en générale claire (un nœud avec un grand &#8220;PageRank&#8221; sera considéré comme &#8220;plus important&#8221; qu&#8217;un nœud en ayant un petit), il existe une série des méthodes (<a href="https://neo4j.com/developer/graph-data-science/graph-embeddings/#supported-graph-embeddings" target="_blank" rel="noopener">fastRP, node2Vec, GraphSAGE</a>) qui permettent de calculer pour chaque nœud un nombre déterminé de valeurs (on parle de <em>vecteur</em>), qui offrent une sorte de résumé de la position du nœud au sein du graphe. Il s&#8217;agit du même principe que pour le <a href="https://fr.wikipedia.org/wiki/Word_embedding" target="_blank" rel="noopener">&#8220;word embedding&#8221; en NLP</a>.</p>
<p>Si l&#8217;on choisit de calculer un <em>graph embedding</em> de taille 16, on obtiendra donc 16 <em>features</em> utilisables par les algorithmes traditionnels de machine learning. Aucune de ces nouvelles colonnes ne sera interprétable en tant que tel. L&#8217;ensemble n&#8217;aura pas non plus de sémantique humainement compréhensible, mais on observe qu&#8217;elle peuvent néanmoins être pertinentes pour un algorithme de machine learning. On peut donc voir le &#8220;graph embedding&#8221; comme une sorte de fonction de hashing pour chaque nœud, dont la valeur n&#8217;est pas interprétable par un être humain, mais l&#8217;est par un ordinateur (plus précisément un algorithme de machine learning).</p>
<h1>Graph native learning</h1>
<p>Les méthodes présentées ci-dessus consistent à &#8220;faire rentrer un rond dans un carré&#8221;: on fait en sorte de faire rentrer dans un modèle tabulaire des données graphes qui ne le sont fondamentalement pas. Ceci permet de profiter de l&#8217;arsenal extrêmement bien développé et mature qu&#8217;est le machine learning, au détriment de la richesse du modèle graphe. </p>
<p>Mais il existe depuis peu (dans Neo4J, depuis les premières versions de la librairie GDS, en 2020 ; mais la littérature est bien plus ancienne) des méthodes de machine learning spécifiquement dédiées aux graphes, qui ne nécessitent pas cette transformation tabulaire. </p>
<p>La principale méthode est celle de la <a href="https://neo4j.com/developer/graph-data-science/link-prediction/" target="_blank" rel="noopener">prédiction de lien (link prediction)</a>&nbsp;: elle consiste à estimer si des relations ne sont pas manquantes dans le graphe. Par exemple, dans un graphe qui établit des interactions connues entre des molécules (médicaments, polluants&#8230;), on pourra suggérer d&#8217;étudier des interactions non-identifiées. Idem pour des interactions entre des clients et des produits (achetés, aimés, consultés&#8230;), qui permettra de faire des recommandations pertinentes aux clients.</p>
<h1>Conclusions</h1>
<p>Dans un <a href="https://www.gartner.com/document/4017768">rapport récent, Gartner</a> estime que d&#8217;ici 2025, les technologies de graphe seront utilisées dans 80% des innovations en analytique, pour seulement 10% en 2021. Il y a donc un énorme potentiel de progression pour les technologies de graphe, et il est clair que le machine learning occupera une place considérable dans cette (r)évolution. Mais il ne sert à rien de mettre la charrue avant les bœufs&nbsp;: une transition vers le &#8220;Graph Machine Learning&#8221; ne peut pas être réussie si l&#8217;on ne maîtrise ni les technologies graphes (et les bases de données orientées graphe) ni le machine learning. Et pour beaucoup d&#8217;entreprises ou d&#8217;administrations, il reste un travail considérable pour prendre ce train en marche. Mais il n&#8217;est pas trop tard!</p>
<hr />
<p><span style="color: #999999;"><em>Ce post est une contribution individuelle de Vandy Berten, spécialisé </em>en<em> data science chez Smals Research. Cet article est écrit en son nom propre et n’impacte en rien le point de vue de Smals.</em></span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sept (bonnes) raisons d&#8217;utiliser une Graph Database</title>
		<link>https://www.smalsresearch.be/sept-bonnes-raisons-dutiliser-une-graph-database/</link>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 19 Feb 2019 08:00:50 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[methodology]]></category>
		<guid isPermaLink="false">/?p=12570</guid>

					<description><![CDATA[Ces dernières années, les bases de données orientées graphes (ou Graph DB, présentées dans nos blogs précédents [1, 2]), et plus généralement les bases de données NoSQL, ont énormément gagné en popularité et en visibilité. Pour preuve, Neo4j, le leader actuel du marché des Graph Databases, apparaît depuis 2014 dans le &#8220;Magic Quadrant for Operational [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p style="text-align:left">Ces dernières années, les bases de données orientées graphes (ou <em>Graph DB, </em>présentées dans nos blogs précédents [<a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations/">1</a>, <a href="/graph-db-vs-rdbms/">2</a>]), et plus généralement les bases de données NoSQL, ont énormément gagné en popularité et en visibilité. Pour preuve, <a href="https://www.neo4j.com">Neo4j</a>, le leader actuel du marché des <em>Graph Databases</em>, apparaît depuis 2014 dans le &#8220;<a href="https://neo4j.com/news/magic-quadrant-operational-database/">Magic Quadrant for Operational Database Management Systems (DBMS)</a>&#8220;, et n&#8217;en est plus sorti depuis, et depuis 2018 dans le &#8220;<a href="https://neo4j.com/news/neo4j-included-in-gartners-magic-quadrant-for-data-management-solutions-for-analytics-2018/">Magic Quadrant for Data Management Solutions for Analytics</a>&#8220;. Le site &#8220;<a href="https://db-engines.com/en/ranking/">DB engine&#8221; positionne Neo4J à la 22<sup>ème</sup> position</a> de son classement de popularité de l&#8217;ensemble de 330 solutions de gestion de bases de données (tous modèles confondus).</p>



<div class="wp-block-image"><figure class="alignleft"><a href="/wp-content/uploads/2019/02/GraphDatabase_PropertyGraph.png"><img loading="lazy" decoding="async" width="300" height="212" src="/wp-content/uploads/2019/02/GraphDatabase_PropertyGraph-300x212.png" alt="" class="wp-image-12726" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/02/GraphDatabase_PropertyGraph-300x212.png 300w, https://www.smalsresearch.be/wp-content/uploads/2019/02/GraphDatabase_PropertyGraph.png 616w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption>Graph database (Labeled Property Graph) &#8211; <a href="https://en.wikipedia.org/wiki/Graph_database">wikipedia</a></figcaption></figure></div>



<p>Les bases de données (orientées) graphes sont très souples, et d&#8217;un point de vue modélisation, sont capables de modéliser facilement tout ce qui peut l&#8217;être avec une RDBMS (bases de données relationnelles, telles que Oracle, Postgresql ou MySQL). La réciproque n&#8217;est pas forcément vraie, en tout cas pour l&#8217;aspect &#8220;facilement&#8221;. La tentation peut dès lors être grande, pour des développeurs qui aiment la nouveauté, de vouloir tout faire dans un modèle graphe. C&#8217;est loin d&#8217;être toujours la meilleure solution et il conviendra, avant de se lancer dans un changement de paradigme, de se poser les bonnes questions. Nous allons au travers des 7 sections suivantes, essayer de contribuer modestement à cette réflexion.</p>



<p>Notons tout d&#8217;abord que, comme mentionné dans <a href="/graph-db-vs-rdbms/">notre article précédent</a>, la question n&#8217;est souvent pas de choisir un RDBMS <strong>ou</strong> une Graph DB, mais plutôt de voir comment ces deux modèles peuvent se compléter, et quel sera le champ d&#8217;application de ceux-ci.</p>



<p>Il s&#8217;agit ici de quelques pistes de réflexion ; les différents aspects ici ne sont ni exclusifs, ni exhaustifs, et l&#8217;ordre n&#8217;est pas pertinent.</p>



<h2 class="wp-block-heading">1. Relations au centre de tout</h2>



<p>La condition de base pour pouvoir utiliser une Graph DB, c&#8217;est que les données puissent être séparées clairement entre nœuds (ou entités) et relations (ou lien) entre ceux-ci. Chaque donnée sera soit un attribut d&#8217;un nœud, soit un attribut d&#8217;une relation (soit un type de nœud ou de relation). Mais ceci est également vrai pour un modèle relationnel, puisqu&#8217;une des premières étapes de l&#8217;analyse classique consiste à décrire le schéma &#8220;entité-relation&#8221;.</p>



<p>Dans un modèle graphe, on s&#8217;attendra à ce que les relations aient un rôle au moins aussi important que les entités, si pas plus. Et qu&#8217;elles aient un sens fondamental, par rapport au business, et pas uniquement parce que la relation est nécessaire d&#8217;un point de vue technique, pour permettre l&#8217;implémentation du modèle.</p>



<p>Prenons pour exemple un cas où l&#8217;on doit implémenter un annuaire de personnes, où chaque personne peut avoir plusieurs numéros de téléphone (et supposons qu&#8217;un même numéro ne peut pas être attribué à plusieurs personnes). Dans un modèle relationnel, on parlerait d&#8217;une relation &#8220;one-to-many&#8221;. Il serait assez artificiel de considérer que les personnes et les numéros de téléphone sont des entités, entre lesquelles on établit une relation. Cette relation n&#8217;aurait pas réellement de sens &#8220;business&#8221;. Le focus ici n&#8217;est pas sur la relation, mais plutôt sur l&#8217;information, multi-valuée dans ce cas-ci. Un modèle RDBMS à deux tables (People et PhoneNumbers) fera très bien l&#8217;affaire.</p>



<p>Par contre, un service de police ou de renseignement qui veut suivre des téléphones pourrait clairement considérer les téléphones et les personnes comme des entités, car les relations auront ici un rôle fondamental&nbsp;: quel téléphone appelle quel téléphone (relation), quand et combien de temps (attribut de la relation), qui possède quel téléphone (relation) à quel moment (attribut de la relation).</p>



<h2 class="wp-block-heading">2. Beaucoup de relations &#8220;many-to-many&#8221;</h2>



<p>Une particularité d&#8217;une relation &#8220;many-to-many&#8221; dans un modèle RDBMS est qu&#8217;elle implique une complexité d&#8217;implémentation importante.  </p>



<div class="wp-block-image"><figure class="alignleft"><img loading="lazy" decoding="async" width="372" height="120" src="/wp-content/uploads/2017/03/GraphDB_relation-2.png" alt="" class="wp-image-10611" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/03/GraphDB_relation-2.png 372w, https://www.smalsresearch.be/wp-content/uploads/2017/03/GraphDB_relation-2-300x97.png 300w" sizes="auto, (max-width: 372px) 100vw, 372px" /></figure></div>



<p> Reprenons l&#8217;exemple de notre <a href="/bases-de-donnees-relationnelles-adequates-pour-des-relations/">blog précédent</a>, illustré ci-contre, où l&#8217;on modélisait la relation entre des travailleurs et leurs employeurs. Une implémentation dans un modèle RDBMS requiert deux tables représentant les entités (&#8220;Workers&#8221; et &#8220;Companies&#8221;), une table représentant la relation (&#8220;Works_for&#8221;), et la gestion fastidieuse d&#8217;une série de clés primaires et étrangères à utiliser dans chaque requête. </p>



<div class="wp-block-image"><figure class="alignright is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2017/02/GraphDB_graphmodel.png" alt="" class="wp-image-10498" width="274" height="91" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/02/GraphDB_graphmodel.png 365w, https://www.smalsresearch.be/wp-content/uploads/2017/02/GraphDB_graphmodel-300x99.png 300w" sizes="auto, (max-width: 274px) 100vw, 274px" /></figure></div>



<p>Une relation dans une Graph DB est représentée beaucoup plus naturellement, sans gestion de clés &#8220;artificielles&#8221; ou de tables techniques intermédiaires. </p>



<p>Au plus le nombre de relations &#8220;many-to-many&#8221; est important dans le modèle de données, au plus grand est le bénéfice de l&#8217;utilisation d&#8217;une Graph DB.</p>



<h2 class="wp-block-heading">3. Beaucoup de &#8220;joins&#8221; entre des grandes tables</h2>



<p>Outre le fait que l&#8217;utilisation des &#8220;join tables&#8221; ajoute une grande complexité, tant en lisibilité du modèle qu&#8217;en lisibilité des requêtes, chaque &#8220;JOIN&#8221; dans une requête SQL nécessite de parcourir une des deux tables de la jointure. Ce parcours, dans le meilleur des cas (si la clé de jointure est indexée), nécessitera un temps logarithmique par rapport à la taille de la table.</p>



<p>Ce n&#8217;est pas un problème si la table parcourue est petite. Il peut par exemple s&#8217;agir d&#8217;une table de traduction, qui convertit un code en un label (code pays &gt; pays, code département &gt; nom de département&#8230;). C&#8217;est nettement plus problématique si l&#8217;on veut connaître tous les produits achetés par un client particulier&nbsp;: il faudra sans doute d&#8217;abord parcourir toutes les commandes pour trouver celles du client, puis tous les produits, sans compter la &#8220;join table&#8221; que l&#8217;on aura entre les commandes et les clients. Cette opération, pourtant toute simple du point de vue business, nécessite une requête SQL aussi complexe que la suivante&nbsp;: </p>



<pre class="wp-block-preformatted"><strong>SELECT </strong>p.name<br><strong>FROM </strong>product <strong>AS </strong>p<br><strong>JOIN </strong>prod_2_com <strong>AS </strong>pc <strong>ON </strong>pc.prod_id = p.id<br><strong>JOIN </strong>command <strong>AS </strong>c <strong>ON </strong>pc.com_id = c.id<br><strong>JOIN </strong>user <strong>AS </strong>u <strong>ON</strong> c.user_id = u.id<br><strong>WHERE </strong>u.name = "Smith" </pre>



<p>Dans un modèle Graph DB, on aura au niveau du nœud &#8220;Client&#8221;, directement accès à la liste des commandes, qui, elles-mêmes, donneront un accès à la liste des produits concernés. Le temps de parcours dépendra donc uniquement du nombre de commandes du client concerné (et pas de l&#8217;ensemble global des commandes), et, pour chaque commande, du nombre de produits associés. La requête Cypher, langage de Neo4J, réalise la même opération que la requête SQL ci-dessus, avec une complexité largement inférieure, et une performance incomparablement meilleure, à tout le moins pour des grosses bases de données&nbsp;: </p>



<pre class="wp-block-preformatted"><strong>MATCH </strong>(u:USER {name:"Smith"})--(:COMMAND)--(p:PRODUCT)<br><strong>RETURN </strong>p.name</pre>



<p>Si, dans la représentation du modèle pour une RDBMS, on se rend compte qu&#8217;il y a un grand nombre de &#8220;JOIN&#8221; entre des grandes tables, il sera pertinent d&#8217;étudier la possibilité d&#8217;une Graph DB.</p>



<h2 class="wp-block-heading">4. Recherches locales </h2>



<p>L&#8217;exemple donné dans la section précédente illustre très bien aussi le point suivant. Ce qui nous a intéressé, c&#8217;était, partant d&#8217;une entité clairement identifiée (le client &#8220;Smith&#8221; comme &#8220;starting point&#8221;), d&#8217;explorer son environnement immédiat (ses commandes, puis ses produits). C&#8217;est une situation où les Graph DB excellent. </p>



<p>Dans une situation qui nécessite de parcourir l&#8217;intégralité de certains attributs pour en agréger un résultat (calculer le montant moyen d&#8217;une commande, ou les clients les plus fidèles ayant dépensé le plus d&#8217;argent), une Graph DB a par contre très peu de chances de concurrencer une DB relationnelle.</p>



<h2 class="wp-block-heading">5. Recherches de &#8220;patterns&#8221;</h2>



<p>La recherche de &#8220;patterns&#8221; ne part typiquement pas d&#8217;un point connu, mais recherche toutes les occurrences d&#8217;une forme particulière de séquences de relations. </p>



<p>Continuons notre exemple ci-dessus, et supposons que l&#8217;entreprise vende des produits, mais également des parties de ceux-ci (des rasoirs et des lames de rasoir, des machines et des pièces de rechange&#8230;), et qu&#8217;une relation &#8220;PART_OF&#8221; soit présente dans les données. Il sera, avec une Graph DB comme Neo4J, facile de recherche l&#8217;ensemble des clients &#8220;prudents&#8221;, qui ont acheté un appareil ainsi que ses pièces de rechanges, dans la même commande ou non&nbsp;:</p>



<pre class="wp-block-preformatted"><strong>MATCH </strong><br>   (u:USER)--(:COMMAND)--(p1:PRODUCT),<br>   (u)--(:COMMAND)--(p2:PRODUCT),<br>   (p1)-[:PART_OF])-(p2)<br><strong>RETURN </strong>u.name, p1.name, p2.name<br></pre>



<p>La même requête en SQL aurait été d&#8217;une complexité sans nom, tant en terme d&#8217;écriture qu&#8217;en terme de vélocité d&#8217;exécution.</p>



<h2 class="wp-block-heading">6. Besoin de flexibilité</h2>



<p>Une base de données comme Neo4j apporte beaucoup de flexibilité à deux niveaux&nbsp;: </p>



<ul class="wp-block-list"><li>Elle est &#8220;schema-less&#8221;, ce qui signifie que&nbsp;: <ol><li>Les attributs ne sont pas figés. C&#8217;est à la création d&#8217;un nœud qu&#8217;on détermine ses attributs, il n&#8217;est pas nécessaire que ceux-ci aient été figés à l&#8217;avance, ni qu&#8217;ils soient les mêmes que dans les autres nœuds du même type.</li><li>Le type de nœud ne l&#8217;est pas non plus. S&#8217;il existe un nœud &#8220;Worker&#8221; à la création de l&#8217;application, on peut décider par la suite de rajouter un label &#8220;Manager&#8221;, simplement en rajoutant ce label sur des nœuds existant ou en créant de nouveaux nœuds avec ce label. </li></ol></li><li>Les extrémités d&#8217;une relation ne sont pas figées. Une relation &#8220;DEPENDS_ON&#8221; peut à la fois relier deux nœuds &#8220;People&#8221; ou deux nœuds &#8220;Package&#8221;.</li></ul>



<p>Cette flexibilité peut être un grand atout, car elle permet de faire évoluer le modèle de données, sans avoir de conséquence sur ce qui tourne déjà. Mais elle peut être aussi vue comme une faiblesse&nbsp;: il sera facile de créer accidentellement un nœud avec un attribut &#8220;name&#8221;, et un autre avec un attribut &#8220;Name&#8221;, qui risque de passer alors sous le radar de requêtes basées sur &#8220;name&#8221;. Ou de créer une relation entre deux nœuds pour lesquels cette relation n&#8217;a pas de sens (PART_OF entre deux clients, par exemple). La responsabilité de la cohérence se reposera alors sur la couche applicative.</p>



<p>Notons que les Graph DB ne sont pas les seules à offrir beaucoup de flexibilité ; c&#8217;est également en général le cas de bases de données &#8220;<a href="https://en.wikipedia.org/wiki/Key-value_database">Key-value</a>&#8221; (<a href="https://redis.io/">Redis</a>&#8230;), ou des <a href="https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_documents">Document stores</a> (<a href="https://www.mongodb.com/">MongoDB</a>&#8230;)</p>



<h2 class="wp-block-heading">7. Requêtes orientées &#8220;chemins&#8221;</h2>



<div class="wp-block-image"><figure class="alignright"><img loading="lazy" decoding="async" width="300" height="167" src="/wp-content/uploads/2019/02/schleich-graph-data-model-ontology-path-e1550483627427-300x167.png" alt="" class="wp-image-12730" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/02/schleich-graph-data-model-ontology-path-e1550483627427-300x167.png 300w, https://www.smalsresearch.be/wp-content/uploads/2019/02/schleich-graph-data-model-ontology-path-e1550483627427-768x426.png 768w, https://www.smalsresearch.be/wp-content/uploads/2019/02/schleich-graph-data-model-ontology-path-e1550483627427-1024x568.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2019/02/schleich-graph-data-model-ontology-path-e1550483627427.png 1124w" sizes="auto, (max-width: 300px) 100vw, 300px" /><figcaption>Chemin dans un graphe. <a href="https://neo4j.com/blog/semantic-pdm-graph-data-model-schleich/" target="_blank" rel="noreferrer noopener" aria-label="Crédit&nbsp;: Neo4j (opens in a new tab)">Crédit&nbsp;: Neo4j</a></figcaption></figure></div>



<p>Supposons qu&#8217;un employé A d&#8217;une entreprise doivent transmettre une information stratégique à un employé B, et qu&#8217;il doive du coup absolument passer par la ligne hiérarchique&nbsp;: il faut donc identifier &#8220;N+x&#8221; de A qui serait le &#8220;N+y&#8221; de B, où &#8220;x&#8221; et &#8220;y&#8221; ne sont pas connus. Ou imaginons que l&#8217;on gère les dépendances entre l&#8217;ensemble des modules produits par une entreprise de développement, et que l&#8217;on ait besoin d&#8217;identifier tous les modules qui seront impactés, directement ou indirectement, par la mise à jour prévue d&#8217;un module.  Ou encore une chaîne de production, qui doit connaître le &#8220;chemin critique&#8221; de production d&#8217;un objet, ou encore l&#8217;ensemble des produits dont la production serait mise à l&#8217;arrêt par l&#8217;entretien d&#8217;une machine de la chaîne. </p>



<p>Ce type de situation nécessite l&#8217;identification d&#8217;un <em>chemin</em>, c&#8217;est-à-dire une succession de relations, dont on ne connaît souvent pas à l&#8217;avance le nombre. En SQL, il faudrait donc une requête pour laquelle le nombre de &#8220;JOIN&#8221; n&#8217;est pas fixé. À notre connaissance, il n&#8217;existe pas de solution standard à ce problème (le &#8220;CONNECT BY&#8221; de Oracle et le &#8220;RECURSIVE&#8221; de Postgre ne s&#8217;utilisent pas du tout de la même façon).</p>



<p>Dans Neo4j, on pourra très facilement identifier le plus court chemin entre deux nœuds, ou l&#8217;ensemble des plus courts chemins, voire même l&#8217;ensemble des chemins possibles, en faisant alors attention au risque d&#8217;explosions combinatoire. On pourra aussi identifier l&#8217;ensemble des chemins entre deux nœuds, ne comportant que des relations d&#8217;un type donné, comprenant entre 5 et 10 sauts.</p>



<h2 class="wp-block-heading">Conclusions</h2>



<p>Cette liste n&#8217;est bien sûr pas exhaustive, et n&#8217;est pas à prendre au pied de la lettre. Les différents éléments seront parfois contradictoires&nbsp;: on peut avoir un modèle avec beaucoup de relations many-to-many, sur lesquelles il sera nécessaire de faire de nombreuses opérations d&#8217;agrégation. Il faudra alors mettre en balance différents arguments ; Quelles sont les opérations qui devront être réactives, liées à une interface utilisateur, et quelles sont celles qui se feront &#8220;en batch&#8221; la nuit, sans nécessité d&#8217;interactivité&nbsp;? Est-il préférable d&#8217;avoir une application très performante, ou plutôt basée sur une technologie bien maîtrisée par l&#8217;entreprise&nbsp;? Chacun aura sa propre réponse.</p>



<p>On pourrait encore identifier beaucoup d&#8217;autres situations ou une Graph DB offre des avantages ; ou des situations où <a href="https://medium.com/neo4j/how-do-you-know-if-a-graph-database-solves-the-problem-a7da10393f5">il ne faut surtout pas s&#8217;en servir</a>. Les liens ci-dessous permettront au lecteur de continuer la réflexion.</p>



<p>Il est à notre sens clair que, bien que les Graph DB ne soient pas adaptées ou optimales dans toutes les situations, elles ont de solides avantages dans de nombreuses circonstances, y compris dans d&#8217;innombrables applications ou le choix d&#8217;une RDBMS a été fait, soit par ignorance d&#8217;alternatives, soit par peur face à un changement de paradigme.</p>



<h2 class="wp-block-heading">Inspirations</h2>



<ul class="wp-block-list"><li><a href="https://medium.com/neo4j/how-do-you-know-if-a-graph-database-solves-the-problem-a7da10393f5">https://medium.com/neo4j/how-do-you-know-if-a-graph-database-solves-the-problem-a7da10393f5</a></li><li><a href="https://linkurio.us/blog/unlocking-value-connected-data/">https://linkurio.us/blog/unlocking-value-connected-data/</a></li><li><a href="https://www.infoworld.com/article/3251829/nosql/why-you-should-use-a-graph-database.html">https://www.infoworld.com/article/3251829/nosql/why-you-should-use-a-graph-database.html</a></li><li><a href="https://radar.oreilly.com/2013/07/why-choose-a-graph-database.html">http://radar.oreilly.com/2013/07/why-choose-a-graph-database.html</a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Le marché du travail salarié en Belgique&#160;: une analyse réseau (partie 3/3)</title>
		<link>https://www.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-3-3/</link>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 24 Jul 2018 07:00:27 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<guid isPermaLink="false">/?p=11689</guid>

					<description><![CDATA[Dans le premier article de notre série consacrée à l&#8217;analyse réseau du marché du travail en Belgique, nous avons présenté les données constituant le graphe (ou réseau) de Dimona, sur lequel se base cette série de trois articles, et montré quelques métriques, permettant par exemple d&#8217;évaluer le nombre de personnes actives à un moment donné, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Dans le <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/">premier article de notre série</a> consacrée à l&#8217;analyse réseau du marché du travail en Belgique, nous avons présenté les données constituant le graphe (ou réseau) de Dimona, sur lequel se base cette série de trois articles, et montré quelques métriques, permettant par exemple d&#8217;évaluer le nombre de personnes actives à un moment donné, ou le nombre d&#8217;employeurs par travailleurs et vice-versa.</p>
<p style="text-align: justify;">Dans <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-2-3/">le second article</a>, nous avons vu que le graphe pouvait être découpé en sous-graphes, soit en considérant les composantes connexes, soit en y calculant des communautés.</p>
<p style="text-align: justify;">Dans ce troisième et dernier article, nous allons nous intéresser dans un premier temps à la notion d&#8217;homophilie, pour ensuite parler du concept de projection d&#8217;un graphe (biparti).</p>
<h1 style="text-align: justify;">Homophilie</h1>
<p style="text-align: justify;">En sociologie, le terme &#8220;homophilie&#8221; (déjà exploité <a href="/un-fraudeur-ne-fraude-jamais-seul/">dans un blog précédent</a>) désigne le fait pour une personne d&#8217;avoir plus d&#8217;affinité avec les personnes similaires à elle-même (&#8220;qui se ressemble s&#8217;assemble&#8221;). Par extension, en théorie des réseaux, on dira qu&#8217;un réseau est homophile si, dans le voisinage immédiat d&#8217;un nœud, on aura tendance à trouver des nœuds similaires à ce nœud. La notion de similarité peut vouloir dire beaucoup de choses&nbsp;: pour des personnes, partager des centres d&#8217;intérêts, une ethnie, un niveau de formation ou socio-économique, une religion&#8230; pour des entreprises, être actif dans le même secteur, dans la même région, voire même être également enclins à frauder.</p>
<p style="text-align: justify;">Nous allons ici voir dans quelle mesure le marché du travail belge est &#8220;homophile&#8221;, et cela selon deux caractéristiques&nbsp;: la province de l&#8217;employeur, et ses codes NACE. Nous nous poserons donc la question suivante&nbsp;: un travailleur employé par une société située en province X (ou exerçant dans le domaine X) va-t-il, s&#8217;il change d&#8217;employeur, favoriser une entreprise de la même province (ou du même domaine)&nbsp;?</p>
<h2 style="text-align: justify;">Homophilie par province</h2>
<h3 style="text-align: justify;">Aperçu général</h3>
<p style="text-align: justify;">En premier lieu, nous allons évaluer, pour chaque province, la proportion de travailleurs qui travaillent dans cette province, puis changent de travail pour un employeur dans une autre province. Le nombre obtenu pourrait ainsi être interprété comme une mesure de la &#8220;fidélisation&#8221; d&#8217;une province.</p>
<p style="text-align: justify;">Il nous faut donc calculer deux valeurs pour chaque province&nbsp;:</p>
<ul style="text-align: justify;">
<li>Le nombre de personnes qui, sur la période étudiée, y ont eu un emploi</li>
<li>Le nombre de personnes qui, après un emploi dans cette province, ont trouvé un emploi dans une autre.</li>
</ul>
<p style="text-align: justify;"><span class="collapseomatic " id="id69d7dd2a4d995"  tabindex="0" title="Requêtes Cypher"    >Requêtes Cypher</span><div id="target-id69d7dd2a4d995" class="collapseomatic_content "></p>
<p style="text-align: justify;">Nombre total de travailleurs par province&nbsp;:</p>
<pre>MATCH (c:Company)--(p:People)
RETURN c.Province, COUNT(DISTINCT p)</pre>
<p style="text-align: justify;">Nombre total de personnes ayant quitté la province&nbsp;:</p>
<pre>MATCH (c1:Company)-[r1]-(w:People)-[r2]-(c2:Company) 
WHERE 
   c1 &lt;&gt; c2 
   AND r1.START &lt;= r2.START 
   AND coalesce(c1.Province, "null") &lt;&gt; c2.Province
RETURN c1.Province, COUNT(DISTINCT p)</pre>
<p style="text-align: justify;"></div></p>
<p style="text-align: justify;">Combinées, ces données nous permettent d&#8217;obtenir le graphique suivant&nbsp;:</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2018/06/Mover_ratio_per_province.png"><img loading="lazy" decoding="async" class="alignleft wp-image-11792" src="/wp-content/uploads/2018/06/Mover_ratio_per_province.png" alt="" width="450" height="300" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/06/Mover_ratio_per_province.png 900w, https://www.smalsresearch.be/wp-content/uploads/2018/06/Mover_ratio_per_province-300x200.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/06/Mover_ratio_per_province-768x512.png 768w" sizes="auto, (max-width: 450px) 100vw, 450px" /></a></p>
<p style="text-align: justify;">Notons que la colonne &#8220;Bruxelles&#8221; est particulière&nbsp;: c&#8217;est dans la capitale que la plupart des entreprises actives sur tout le territoire (ministères, chaînes de magasins&#8230;) ont leur siège social. Le fait que son employeur soit renseigné à Bruxelles ne veut donc pas dire que l&#8217;on travaille dans cette ville.</p>
<p style="text-align: justify;">Le graphique nous indique que 63% des personnes ayant travaillé dans le Brabant Flamand ont ensuite trouvé un emploi ailleurs, alors que seuls 46 % des travailleurs liégeois ont quitté leur province. En termes d&#8217;homophilie, on peut donc estimer que Liège est plus &#8220;homophile&#8221; que le Brabant Flamand&nbsp;: dans le &#8220;voisinage&#8221; de Liège (les autres employeurs des travailleurs d&#8217;employeurs liégeois), on trouve une plus grande proportion d&#8217;entreprises Liégeoises qu&#8217;on ne trouve d&#8217;entreprises (flamo-)brabançonnes dans le voisinage du Brabant Flamand.</p>
<p style="text-align: justify;">Notons que ce constat ne dit rien des raisons&nbsp;: les liégeois ne sont pas nécessairement &#8220;pantouflards&#8221;, il se peut que les conditions de travail y soient si bonnes que rares sont ceux qui veulent aller voir ailleurs.</p>
<h3 style="text-align: justify;">Aperçu détaillé</h3>
<p style="text-align: justify;">Si l&#8217;on veut une vue plus détaillée de cette notion d&#8217;homophilie provinciale, on peut aussi comparer, pour chaque province P, les deux répartitions suivantes&nbsp;:</p>
<ul style="text-align: justify;">
<li>La répartition du voisinage de P, c&#8217;est-à-dire les provinces où travaillent tous les travailleurs qui ont d&#8217;abord travaillé pour une entreprise situé en province P</li>
<li>La répartition générale des travailleurs par province.</li>
</ul>
<p style="text-align: justify;">Pour la répartition générale, nous allons calculer le nombre de personnes ayant eu, au cours de ce 15 dernières années, un emploi dans chaque province.</p>
<p style="text-align: justify;"><img loading="lazy" decoding="async" class="wp-image-11789 alignright" src="/wp-content/uploads/2018/06/Worker_per_province.png" alt="" width="450" height="300" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/06/Worker_per_province.png 900w, https://www.smalsresearch.be/wp-content/uploads/2018/06/Worker_per_province-300x200.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/06/Worker_per_province-768x512.png 768w" sizes="auto, (max-width: 450px) 100vw, 450px" /></p>
<p style="text-align: justify;">Comme nous souhaitons obtenir une distribution, la somme de toutes nos colonnes doit être égale à 1 (ou 100%). Nous divisons donc chaque colonne par la somme de toutes les colonnes. Cette valeur est supérieure à la population totale, car chaque travailleur ayant travaillé dans deux provinces sera compté 2 fois. Ce qui compte, ce n&#8217;est pas la hauteur absolue d&#8217;une colonne, mais sa hauteur par rapport aux autres colonnes.</p>
<p style="text-align: justify;">Nous obtenons le graphique ci-contre.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id69d7dd2a4da20"  tabindex="0" title="Requêtes Cypher"    >Requêtes Cypher</span><div id="target-id69d7dd2a4da20" class="collapseomatic_content "></p>
<p style="text-align: justify;">Nombre total de travailleurs par province&nbsp;:</p>
<pre>MATCH (c:Company)--(p:People)
RETURN c.Province, COUNT(DISTINCT p)</pre>
<p style="text-align: justify;"></div></p>
<p style="text-align: justify;">Nous calculons ensuite, pour chaque province P, le nombre de personnes qui, après un emploi dans cette province P, ont eu un autre emploi dans cette même province, ce qui nous donne la série de graphiques ci-dessous.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id69d7dd2a4da7a"  tabindex="0" title="Requête Cypher"    >Requête Cypher</span><div id="target-id69d7dd2a4da7a" class="collapseomatic_content "></p>
<pre>MATCH (c1:Company)-[r1]-(p:People)-[r2]-(c2:Company) 
WHERE c1 &lt;&gt; c2 AND r1.START &lt;= r2.START
RETURN c1.Province, c2.Province, COUNT(DISTINCT p)</pre>
<p style="text-align: justify;"></div></p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2018/06/Homophily.png" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="alignleft wp-image-11793 size-large" src="/wp-content/uploads/2018/06/Homophily-1024x512.png" alt="" width="688" height="344" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/06/Homophily-1024x512.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2018/06/Homophily-1536x768.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2018/06/Homophily-2048x1024.png 2048w, https://www.smalsresearch.be/wp-content/uploads/2018/06/Homophily-300x150.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/06/Homophily-768x384.png 768w" sizes="auto, (max-width: 688px) 100vw, 688px" /></a></p>
<p style="text-align: justify;">Notons qu&#8217;il est difficile de comparer la vue générale que nous avons montrée ci-dessus avec cette série de graphiques, pour plusieurs raisons&nbsp;:</p>
<ul style="text-align: justify;">
<li>La série de graphiques montre comment se sont comportés ceux qui ont changé de travail. On ne compte donc pas ceux qui n&#8217;ont jamais changé d&#8217;employeurs, ce qui représente un peu plus de 42 % des travailleurs, comme mentionné dans <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/">notre premier blog</a> .</li>
<li>Un travailleur qui a d&#8217;abord travaillé à Bruxelles, pour ensuite partir à Namur et puis à Mons, en Hainaut, sera repris à la fois dans les transferts Bruxelles-Namur, mais également Bruxelles-Hainaut. On ne peut donc pas sommer les migrations entre une province et les autres pour connaitre le nombre de personnes ayant quitté la province.</li>
<li>Si la hauteur absolue d&#8217;une colonne dans le graphique général a un sens (proportion de travailleurs ayant quitté la province), elle n&#8217;en a pas vraiment la série de graphiques qui suit.</li>
</ul>
<p style="text-align: justify;">Quelques observations peuvent être faites&nbsp;:</p>
<ul style="text-align: justify;">
<li>La répartition du voisinage de Bruxelles diffère peu de la répartition globale des travailleurs&nbsp;: cela s&#8217;explique très probablement par ce qui a déjà été évoqué, la plupart des grandes structures ayant leur siège social à Bruxelles</li>
<li>En dehors de Bruxelles, le voisinage d&#8217;une province reste majoritairement dans la même région (Flandre ou Wallonie)</li>
</ul>
<h2 style="text-align: justify;">Homophilie par secteur (Code NACE)</h2>
<p style="text-align: justify;">Nous avons réalisé une analyse similaire sur base des Code NACE (<a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/">décrits dans notre premier article</a>), précisant le secteur d&#8217;activité, à nouveau en excluant les contrats d&#8217;intérim. Nous nous posons la question suivante&nbsp;: le &#8220;voisinage d&#8217;un secteur&#8221; (à savoir les entreprises dans lesquelles travaillent les travailleurs d&#8217;entreprises du dit secteur) est-il différenciable de l&#8217;ensemble de la population des entreprises&nbsp;?</p>
<p style="text-align: justify;">Nous présentons pour ce faire <a href="/wp-content/uploads/2018/06/Homophily_NACE_NOINTERIM.pdf" target="_blank" rel="noopener">les graphiques accessibles dans ce document joint</a>.</p>
<p style="text-align: justify;">Pour chaque page, correspondant à un code NACE (de premier niveau), on trouve sur la première ligne la comparaison entre la distribution des codes NACE des entreprises en général (en bleu) et la distribution des entreprises employant au moins un travailleur ayant été embauché par une entreprise du code NACE concerné. À gauche, la comparaison se fait sur base du nombre d&#8217;entreprises. À droite, sur base du nombre de travailleurs. En titre, le coefficient de correlation (selon <a href="https://en.wikipedia.org/wiki/Pearson_correlation_coefficient">la méthode de Pearson</a>) indique à quel point le voisinage du secteur analysé diffère de la distribution globale. Proche de 1, il sera quasiment indifférenciable, plus on s&#8217;en éloigne, plus spécifique sera le voisinage du secteur analysé.</p>
<p style="text-align: justify;">Les graphiques du bas, indiquent, pour chaque code NACE, le ratio entre les deux colonnes du graphique du haut. Il s&#8217;agit d&#8217;une autre façon de voir les secteurs surreprésentés (au dessus de la ligne pointillée rouge) et sous-représentés (en dessous de la ligne).</p>
<p style="text-align: justify;">Nous constatons que pour quasiment tous les secteurs, ce même secteur est sur-représenté dans le voisinage, montrant que le phénomène d&#8217;homophilie est observé. La sur-représentation présente cependant des grandes variations&nbsp;: à peine perceptible pour le commerce (code G), très importante pour des secteurs très spécialisés (et concernant très peu de monde), comme les activités extra-territoriales (code U) ou l&#8217;extraction (code B).</p>
<p style="text-align: justify;">Nous laissons au lecteur le choix d&#8217;aller plus loin dans l&#8217;analyse, en identifiant par exemple des secteurs &#8220;associés&#8221; (souvent sur-représentés ensemble).</p>
<h1 style="text-align: justify;">Projection biparti</h1>
<p><figure id="attachment_11764" aria-describedby="caption-attachment-11764" style="width: 300px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/05/bipartite_projection.png"><img loading="lazy" decoding="async" class="wp-image-11764 size-medium" src="/wp-content/uploads/2018/05/bipartite_projection-300x271.png" alt="" width="300" height="271" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/05/bipartite_projection-300x271.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/05/bipartite_projection.png 653w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-11764" class="wp-caption-text">Graphe biparti (à gauche), représentant les liens entre employés et employeurs, et ses deux projections biparti (à droite), représentant le réseau des collègues (en haut) et le réseaux des employeurs (en bas). Les poids, en bleu, indiquent respectivement le nombre d&#8217;employeurs et d&#8217;employés en commun.</figcaption></figure></p>
<p style="text-align: justify;">Lorsque l&#8217;on a un graphe biparti, c&#8217;est-à-dire un graphe avec deux types de nœuds A et B (comme par exemple travailleur et employeur) et des arcs qui vont uniquement entre un nœud du type A et un nœud du type B (comme par exemple les relations de travail), on peut réaliser ce qu&#8217;on appelle une projection biparti. Il s&#8217;agit d&#8217;un graphe qui ne comportera que des nœuds d&#8217;un type A (resp. B), et qui aura un arc entre deux nœuds x<sub>1</sub> et x<sub>2</sub> s&#8217;il existe dans le graphe d&#8217;origine un nœud du type B (resp. A), lié à x<sub>1</sub> et à x<sub>2</sub>. Il existe toujours deux projections d&#8217;un graphe biparti : une pour chaque type de nœud. Dans le cas qui nous occupe, nous aurons un graphe reprenant la totalité des employeurs, et un lien entre deux employeurs s&#8217;il existe une personne ayant travaillé pour les deux employeurs, et un graphe reprenant la totalité des travailleurs, avec un lien entre deux travailleurs s&#8217;ils ont un jour été collègue (en supposant deux personnes collègues si elles ont travaillé pour un même employeur, mais pas nécessairement en même temps).</p>
<p style="text-align: justify;">Les arcs créés dans la projection biparti sont souvent associée à un poids, qui peut par exemple avoir pour valeur le nombre de nœuds &#8220;compressés&#8221; dans la projection&nbsp;: il peut s&#8217;agit du nombre de travailleurs partagés dans le cas de la projection sur les employeurs, ou du nombre d&#8217;entreprises dans lequel les deux extrémités de la relation ont été collègues.</p>
<p style="text-align: justify;">Pour l&#8217;analyse qui suit, nous n&#8217;avons pas considéré les travailleurs intérimaires, qui, par nature, changent souvent d&#8217;employeurs, et pourraient fausser les impressions. Nous n&#8217;avons par ailleurs considéré que <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-2-3/">la composante géante (voir notre article précédent)</a>. Par définition, il n&#8217;y aura pas de travailleurs en commun entre deux entreprises faisant partie de deux composantes connexes distinctes.</p>
<p style="text-align: justify;">Nous n&#8217;avons pas pu réaliser l&#8217;analyse qui suit dans la base de donnée Neo4j, n&#8217;ayant trouvé aucune fonctionnalité permettant de réaliser les projections voulues. Nous avons utilisé la librairie <a href="https://igraph.org">igraph</a>.</p>
<p style="text-align: justify;"><span style="color: #000000; font-weight: bold;">Projection par entreprise</span></p>
<p style="text-align: justify;">La première projection que nous avons réalisée est la projection par entreprise. Elle comporte un peu plus de 530 000 employeurs, et 22 millions de liens. En regardant le poids de ces liens (indiquant dont le nombre de travailleurs partagés), on en trouve 18.6 millions ayant la valeur 1. Il y a donc 18.6 millions de couples d&#8217;employeurs ne partageant qu&#8217;un seul travailleur. Les valeurs les plus intéressantes se trouvent à l&#8217;autre extrémité&nbsp;: il existe deux employeurs se partageant 37 350 travailleurs&nbsp;! Nous y trouvons ensuite un triplet d&#8217;employeurs qui se partagent deux par deux, respectivement, 11 000, 10 000 et 7 000 travailleurs.</p>
<p style="text-align: justify;">Le premier est le fait d&#8217;une société nationale, qui a une structure juridique séparée pour la gestion de ses ressources humaines. Chaque travailleur y est déclaré dans les deux structures. Le second concerne un organisme de gestion d&#8217;artistes, divisé en plusieurs structures juridiques distinctes. On trouve aussi un chaîne de grands magasins de près de 140 000 salariés (dont un très grand nombre de jobistes), partageant 5 800 travailleurs avec un ministère de 250 000 salariés. Il n&#8217;est bien sûr pas surprenant que deux aussi gros employeurs partagent autant de personnel. L&#8217;essentiel de ce que l&#8217;on voit par la suite est du même acabit&nbsp;: de très gros employeurs, liés entre eux par un nombre de salariés qui est dans l&#8217;absolu élevé, mais pas relativement au nombre d&#8217;employés respectif. Une analyse plus approfondie, où l&#8217;on placerait en poids la proportion de personnel partagé (par exemple, avec la <a href="https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard">distance de Jaccard</a>) apporterait un autre éclairage. On pourrait par exemple détecter des transferts d&#8217;entreprises, des rachats ou des fusions. Nous n&#8217;irons pas plus loin ici dans cette analyse.</p>
<h2 style="text-align: justify;">Projection par travailleur</h2>
<p style="text-align: justify;">La projection par travailleur pose un problème de taille&nbsp;: elle est très largement plus volumineuse que celle par entreprise. Nous sommes parvenus à déterminer qu&#8217;elle devait comporter un peu plus de 7 millions de nœuds, et pas loin de 400 millions d&#8217;arcs, mais, en utilisant la libraire igraph sur un serveur ayant à sa disposition 64 GB de mémoire, nous n&#8217;avons pas réussi à la calculer. Cependant, nous voulions principalement mettre en évidence les couples de personnes partageant de nombreux employeurs.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id69d7dd2a4db08"  tabindex="0" title="Cliquer ici pour voir comment nous avons malgré tout pu contourner cette limitation"    >Cliquer ici pour voir comment nous avons malgré tout pu contourner cette limitation</span><div id="target-id69d7dd2a4db08" class="collapseomatic_content "></p>
<p style="text-align: justify;">Dès lors, nous pouvions d&#8217;entrée de jeu éliminer de nos données tous les employeurs ayant moins de deux travailleurs. En effet, un employeur avec un seul travailleur ne pourra par définition pas être un employeur commun entre deux personnes. Cette simplification n&#8217;aura aucun impact sur la projection, ces employeurs supprimés n&#8217;étant jamais considérés comme &#8220;en commun&#8221; entre deux travailleurs, et donc n&#8217;apparaissent dans aucun poids.</p>
<p><figure id="attachment_11766" aria-describedby="caption-attachment-11766" style="width: 400px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/05/projection_simplification.png"><img loading="lazy" decoding="async" class="wp-image-11766" src="/wp-content/uploads/2018/05/projection_simplification.png" alt="" width="400" height="377" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/05/projection_simplification.png 653w, https://www.smalsresearch.be/wp-content/uploads/2018/05/projection_simplification-300x283.png 300w" sizes="auto, (max-width: 400px) 100vw, 400px" /></a><figcaption id="caption-attachment-11766" class="wp-caption-text">Simplification d&#8217;un graphe avant projection. Les noeuds &#8220;i&#8221; et &#8220;3&#8221; sont supprimés. À droite&nbsp;: les projections originale (en haut) et simplifiée (en bas).</figcaption></figure></p>
<p style="text-align: justify;">Dans le même ordre d&#8217;idée, si nous voulons trouver tous les couples de travailleurs partageant au moins, mettons, 10 employeurs, nous pouvons également éliminer tous les travailleurs ayant moins de 10 employeurs (pour avoir 10 employeurs en commun avec un autre travailleur, il faut avoir soi-même au moins 10 employeurs). Cette dernière simplification supprimera des nœuds dans la projection résultante, mais uniquement des nœuds qui, dans la projection, ne seront liés à aucun nœud avec un poids supérieur ou égale au seuil fixé (10 dans notre exemple). L&#8217;illustration ci-dessous montre un graphe biparti (vert et orange), pour lequel on veut réaliser la projection &#8220;verte&#8221;, avec un seuil fixé à 4.</p>
<p style="text-align: justify;">Avec la première simplification, le nœud orange &#8220;i&#8221; (degré = 1, inférieur à 2) est supprimé. Avec la seconde simplification, le nœud vert &#8220;3&#8221; (degré = 3, inférieur au seuil 4) est supprimé lui aussi. Les deux projections (complète et simplifiée) sont ensuite montrées sur la droite. On y voit qu&#8217;en dehors de la suppression du nœud 3, les poids sur les arcs sont identiques.</p>
<p style="text-align: justify;"></div></p>
<p style="text-align: justify;">Le résultat de cette projection nous montre que bon nombre de travailleurs partagent un grand nombre d&#8217;employeur avec d&#8217;autre salariés. Par exemple, 32 couples de travailleurs (au total, 24 travailleurs), partagent deux par deux plus de 30 employeurs (jusqu&#8217;à 46), comme illustré ci-dessous, où chaque nœud représente un travailleur, et les labels sur les arcs le nombre d&#8217;employeurs commun entre deux travailleurs.</p>
<p><figure id="attachment_11772" aria-describedby="caption-attachment-11772" style="width: 688px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/05/shared_employers_trh30.png"><img loading="lazy" decoding="async" class="wp-image-11772 size-large" src="/wp-content/uploads/2018/05/shared_employers_trh30-1024x294.png" alt="" width="688" height="198" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/05/shared_employers_trh30-1024x294.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2018/05/shared_employers_trh30-300x86.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/05/shared_employers_trh30-768x221.png 768w, https://www.smalsresearch.be/wp-content/uploads/2018/05/shared_employers_trh30.png 1297w" sizes="auto, (max-width: 688px) 100vw, 688px" /></a><figcaption id="caption-attachment-11772" class="wp-caption-text">Projection par travailleur, en fixant un seuil à 30 (on ne garde donc que les travailleurs partageant 30 employeurs en commun ou plus). Chaque nœud représente un travailleur, le label sur les arcs indique le nombre d&#8217;employeurs en commun.</figcaption></figure></p>
<p style="text-align: justify;">Une analyse plus approfondie ce ces différents clusters mets en avant certains secteurs&nbsp;: le cluster de gauche concerne des employés embauchés essentiellement en tant que travailleurs occasionnels dans le secteur de la collecte de fruits et légumes ; celui du milieu des entreprises des arts du spectacles. Il s&#8217;agit de deux secteurs pour lesquels on change fréquemment d&#8217;employeur entre chaque &#8220;prestation&#8221; (une saison de collecte ou une tournée de spectacle).</p>
<p style="text-align: justify;">Pour chacune des relations affichées sur le réseau ci-dessus, nous avons également calculé la <a href="https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard">distance de Jaccard</a>, qui indique le ratio entre le nombre de voisins communs entre deux nœuds, et le nombre total de voisins de ces deux nœuds. Il se situe à chaque fois entre 25 et 45 %. Ceci indique que nous ne sommes donc pas dans une situation similaire à celle évoquée ci-dessus (pour la projection par employeur), ou deux &#8220;super-employeurs&#8221; avaient toutes les chances de partager quelques salariés, mais bien dans des situations ou deux travailleurs partagent une partie importante de leurs employeurs. Il y a donc fort à parier que, dans beaucoup de cas, il s&#8217;agisse de personnes qui cherchent du travail ensemble. Ceci pourrait être corroboré en menant une analyse plus fine, et en ne considérant qu&#8217;un employeur n&#8217;est commun entre deux travailleurs que si les périodes d&#8217;engagement coïncident. Nous avons mené cette observation manuellement pour les relations les plus fortes, et observé que c&#8217;était le cas dans la majorité des relations de travail.</p>
<h1 style="text-align: justify;">Conclusions</h1>
<p style="text-align: justify;">Cette série d&#8217;articles a mis en lumière la puissance que l&#8217;analyse réseau, en combinaison avec une base de données orientée graphes, pouvait offrir. La gamme de résultats est très large&nbsp;: on peut à la fois obtenir des métriques offrant une vue très générale (le nombre de travailleurs à un moment donné, le nombre moyen d&#8217;employeurs par travailleur&#8230;), mais également isoler facilement des comportements qui sortent du lot (travailleurs changeant anormalement souvent d&#8217;employeur, employeurs ayant du personnel extrêmement fidèle&#8230;). L&#8217;analyse réseau est donc à la fois un excellent complément de l&#8217;analyse statistique classique, mais est également un outil de très grande valeur pour détecter la fraude ou les erreurs et autres problèmes de qualité dans les données.</p>
<p style="text-align: justify;">Il va de soi que, en combinaison avec des experts soit du marché de l&#8217;emploi, soit en statistiques, de nombreuses autres observations pourraient être faites. Certaines de celles-ci pourraient également être obtenues avec des techniques statistiques classiques, mais beaucoup nécessiteraient un travail démesuré, voire même seraient tout simplement impossibles.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Le marché du travail salarié en Belgique&#160;: une analyse réseau (partie 2/3)</title>
		<link>https://www.smalsresearch.be/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-2-3/</link>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 26 Jun 2018 07:00:20 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<guid isPermaLink="false">/?p=11563</guid>

					<description><![CDATA[Dans notre article précédent, nous avons montré quelques éléments d&#8217;analyse réseau appliquée à la base de données &#8220;Dimona&#8221;, qui recense, en Belgique, les relations de travail entre tous les employeurs et leurs employés. Nous y avons principalement analysé la notion de degré, permettant de voir le nombre d&#8217;employeurs par employé, et le nombre d&#8217;employés par [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Dans <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/">notre article précédent</a>, nous avons montré quelques éléments d&#8217;analyse réseau appliquée à la base de données &#8220;Dimona&#8221;, qui recense, en Belgique, les relations de travail entre tous les employeurs et leurs employés. Nous y avons principalement analysé la notion de degré, permettant de voir le nombre d&#8217;employeurs par employé, et le nombre d&#8217;employés par employeur.</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2018/04/Dimona.png"><img loading="lazy" decoding="async" class="alignleft wp-image-11593 size-medium" src="/wp-content/uploads/2018/04/Dimona-300x221.png" alt="" width="300" height="221" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/04/Dimona-300x221.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/04/Dimona.png 428w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>Nous allons maintenant examiner deux façons de découper le réseau en plusieurs &#8220;sous-réseau&#8221;&nbsp;: dans un premier temps une découpe par &#8220;composante connexe&#8221;, ensuite par détection de communauté.</p>
<p style="text-align: justify;">Rappelons que nous considérons un graphe (ou réseau) selon le modèle présenté ci-contre&nbsp;: nous avons deux types de nœuds (travailleurs et employeurs) ; la relation entre un travailleur et un employeur indique les dates de début et fin (si applicable) de contrat, ainsi qu&#8217;un &#8220;worker code&#8221;, décrivant une série de catégories présentées dans l&#8217;article précédent.</p>
<h1 style="text-align: justify;">1. Composante connexe</h1>
<p style="text-align: justify;">En partant d&#8217;un travailleur donné, on peut, en parcourant le graphe, trouver tous ses collègues, actuels ou anciens, via le lien &#8220;travailleur→employeur&#8221;, puis &#8220;employeur→travailleur&#8221;. Si, à partir de ces collègues, on re-parcourt le graphe de la même façon, on obtiendra les &#8220;collègues de collègues&#8221; du travailleur de départ. <a href="/wp-content/uploads/2018/06/composante_connexe.png"><img loading="lazy" decoding="async" class="size-medium wp-image-11895 alignright" src="/wp-content/uploads/2018/06/composante_connexe-243x300.png" alt="" width="243" height="300" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/06/composante_connexe-243x300.png 243w, https://www.smalsresearch.be/wp-content/uploads/2018/06/composante_connexe.png 521w" sizes="auto, (max-width: 243px) 100vw, 243px" /></a>En continuant de la sorte tant que l&#8217;on tombe sur des travailleurs que l&#8217;on n&#8217;a pas encore rencontrés, on parcourt ainsi une &#8220;<a href="https://fr.wikipedia.org/wiki/Graphe_connexe">composante connexe</a>&#8220;, soit un ensemble (maximal) de nœuds pour lequel il existe un chemin entre chaque paire de nœuds. Tous les nœuds d&#8217;un graphe ne font pas nécessairement partie de la même composante connexe&nbsp;: si deux travailleurs font partie de deux composantes connexes distinctes, il n&#8217;existe pas de chemin &#8220;(ex-)collègue de (ex-)collègue de (ex-)collègue &#8230;&#8221; entre ces deux travailleurs.</p>
<p style="text-align: justify;">Le graphe ci-contre illustre un réseau composé de trois composantes connexes&nbsp;: une en haut à gauche, composée de 4 nœuds ; une seconde en bas à droite, de 5 nœuds ; une dernière, plus importante, entre les deux.</p>
<h2 style="text-align: justify;">Composante géante</h2>
<p style="text-align: justify;">On appellera &#8220;composante géante&#8221; la plus grande composante connexe d&#8217;un graphe. Si on effectue ce calcul sur notre graphe de Dimona, on obtiendra une composante effectivement géante&nbsp;: elle est composée de 8 149 146 de nœuds, dont 581 065 entreprises et  7 568 081 travailleurs.</p>
<p style="text-align: justify;">En d&#8217;autres mots, si l&#8217;on considère toutes les relations de travail de ces 15 dernières années, 99.5% des travailleurs ayant été actifs sur cette période sont &#8220;(ex-)collègue de (ex-)collègue de (ex-)collègue &#8230;&#8221; entre eux, via 95 % des entreprises. Ceci en considérant que deux personnes sont collègues si elles ont eu le même employeur, simultanément ou non. Le monde du travail (belge) peut donc être vu comme un &#8220;petit monde&#8221;, théorisé par <a href="https://fr.wikipedia.org/wiki/%C3%89tude_du_petit_monde">Milgram dans son paradoxe éponyme.</a></p>
<h1 style="text-align: justify;">Diamètre</h1>
<p style="text-align: justify;">En analysant de plus près cette composante géante, on voit que son diamètre, soit le nombre de relations du plus long &#8220;plus court chemin&#8221; entre deux nœuds, est de 20. Ce qui veut dire que, pour 99.5% des travailleurs actifs sur la période, il n&#8217;est jamais nécessaire de passer par plus de 9 (ex-)collègues intermédiaires pour &#8220;connecter&#8221; deux travailleurs.</p>
<p><figure id="attachment_11589" aria-describedby="caption-attachment-11589" style="width: 1288px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/04/Diameter.png"><img loading="lazy" decoding="async" class="wp-image-11589 size-full" src="/wp-content/uploads/2018/04/Diameter.png" alt="" width="1288" height="253" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/04/Diameter.png 1288w, https://www.smalsresearch.be/wp-content/uploads/2018/04/Diameter-300x59.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/04/Diameter-768x151.png 768w, https://www.smalsresearch.be/wp-content/uploads/2018/04/Diameter-1024x201.png 1024w" sizes="auto, (max-width: 1288px) 100vw, 1288px" /></a><figcaption id="caption-attachment-11589" class="wp-caption-text">Plus long &#8220;plus court chemin&#8221; qu&#8217;il est possible de faire dans Dimona. De longueur 20, il nécessite 9 travailleurs intermédiaires pour relier A et K.</figcaption></figure></p>
<p style="text-align: justify;">En moyenne, il faut 1.5 collègues intermédiaires pour chaque paire de travailleurs (longueur moyenne du plus court chemin entre deux nœuds&nbsp;: 5), et dans 99 % des cas, 3 travailleurs intermédiaires sont suffisants (percentile 0.99 = 8, comme entre A et E, dans la figure ci-dessus).</p>
<p style="text-align: justify;">Si l&#8217;on prend deux travailleurs (faisant partie de la composantes géantes, soit pour l&#8217;essentiel n&#8217;étant pas le seul salarié d&#8217;une entreprise) au hasard, il y a 59% de chances qu&#8217;ils aient un collègue en commun, en prenant la définition large de collègue, voulant dire &#8220;ayant eu un employeur en commun, mais pas nécessairement en même temps&#8221;.</p>
<p style="text-align: justify;">Notons qu&#8217;une partie de ce qui explique ce &#8220;petit monde&#8221; est ce qu&#8217;on appelle les &#8220;super-connecteurs&#8221; : il s&#8217;agit de nœuds ayant un degré très élevé. Tous les enseignants (du même régime linguistique) sont par exemple employés par le même ministère.</p>
<p style="text-align: justify;">Notons également que même si l&#8217;on s&#8217;intéresse à une période plus petite, la composante géante reste importante&nbsp;: si l&#8217;on ne considère que les relations de travail entre 2013 et 2017, la composante fera alors 6 253 490 nœuds, dont 5 907 213 travailleurs, soit 99% des 5 966 745 travailleurs actifs sur cette période-là. On descend à 96% en ne regardant que les relations de travail en 2017.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id69d7dd2a51460"  tabindex="0" title="Requêtes Cypher"    >Requêtes Cypher</span><div id="target-id69d7dd2a51460" class="collapseomatic_content "></p>
<p style="text-align: justify;">Création des partitions&nbsp;:</p>
<p style="text-align: justify;"><code>CALL algo.unionFind(NULL, NULL, {write:true, partitionProperty:"partition"})</code><br />
<code>YIELD nodes, setCount, loadMillis, computeMillis, writeMillis;</code></p>
<p style="text-align: justify;">Création des partitions pour les relations entre 2013 et 2017&nbsp;:</p>
<p style="text-align: justify;"><code>CALL algo.unionFind(</code><br />
<code> "MATCH (p) RETURN id(p) as id",</code><br />
<code> "MATCH (p1)-[r]-&gt;(p2) WHERE r.START &lt;= '2017-12-31' AND (r.END IS NULL or r.END &gt;= '2013-01-01') RETURN id(p1) as source, id(p2) as target",</code><br />
<code> {graph:'cypher', write:true, partitionProperty&nbsp;:'partition2013_2017'}</code><br />
<code>);</code></p>
<p style="text-align: justify;">Nombre de partitions en fonction de la taille&nbsp;:</p>
<p style="text-align: justify;"><code>MATCH (n)</code><br />
<code>WITH DISTINCT (n.partition) AS partition, COUNT(*) AS partition_size</code><br />
<code> WITH partition_size, COUNT(partition) AS nb_partitions</code><br />
<code>RETURN partition_size, nb_partitions</code><br />
<code> ORDER BY partition_size</code></p>
<p style="text-align: justify;"></div></p>
<h1 style="text-align: justify;">Autres composantes connexes</h1>
<p style="text-align: justify;">Le réseau complet de Dimona, sur base des relations de 2003 à 2017, est composé de 28 224 composantes connexes. Nous venons de voir que la très grande majorité des nœuds font partie de la même composante connexe.</p>
<p style="text-align: justify;">À l&#8217;autre extrémité, nous avons un grand nombre de composantes connexes toutes petites&nbsp;: 22 013 d&#8217;entre elles sont composées de deux nœuds, donc un travailleur et un employeur. Ce qui veut donc dire que l&#8217;on a 22 013 travailleurs qui n&#8217;ont eu qu&#8217;un seul employeur durant les 15 ans de notre analyse, et dont ils ont été l&#8217;unique employé. On peut imaginer que pour beaucoup d&#8217;entre eux, il s&#8217;agit de personnes qui, au lieu de choisir un statut d&#8217;indépendant, ont préféré créer leur propre société pour s&#8217;y engager. Ceci pourrait être confirmé en croisant ces données avec celles de la <a href="https://economie.fgov.be/fr/themes/entreprises/banque-carrefour-des">Banque Carrefour des Entreprises</a>, organisme officiel auprès duquel doivent s&#8217;inscrire toutes les entreprises (y compris ceux qui ne sont pas des employeurs, comme les indépendants, les professions libérales&#8230;), et y préciser le noms des fondateurs, gérants ou administrateurs.</p>
<p style="text-align: justify;">On trouve également 4 300 partitions de taille 3 (deux employeurs et un travailleur, ou un employeur et deux travailleurs) et un peu plus de 1 100 partitions de taille 4.</p>
<p style="text-align: justify;">Restent ensuite un peu moins de 800 partitions de taille variant entre 5 et 61.</p>
<p style="text-align: justify;">Nous pouvons identifier quelques &#8220;patterns&#8221;&nbsp;:</p>
<ul style="text-align: justify;">
<li><strong>&#8220;Schéma en étoile&#8221;</strong>&nbsp;: un seul travailleur, et de 3 (121 fois) à 6 (3 fois) sociétés. Notons que l&#8217;on trouve aussi ce schéma dans la composante connexe géante&nbsp;: nous avons ainsi 25 travailleurs ayant été le seul travailleur de plus de 10 entreprises sur les 15 dernières années (mais ces travailleurs ont été également engagés par d&#8217;autres employeurs).<br />
<span class="collapseomatic " id="id69d7dd2a514bd"  tabindex="0" title="Requête Cypher"    >Requête Cypher</span><div id="target-id69d7dd2a514bd" class="collapseomatic_content "><code>MATCH (n1:Company)--(p:People) </code><br />
<code>WHERE size((n1)--()) = 1 </code><br />
<code>WITH p, COUNT(DISTINCT n1) as nb_comp WHERE nb_comp &gt;= 10 </code><br />
<code>RETURN p, nb_comp </code><br />
<code>ORDER BY nb_comp DESC </code><br />
<code>LIMIT 100</code><br />
</div>Nous voyons principalement deux explications à ces étoiles&nbsp;:</p>
<ul style="list-style-type: circle;">
<li>&#8220;<strong>Faux indépendants</strong>&#8221;&nbsp;: schéma similaire à celui décrit plus haut, si ce n&#8217;est que la personne a ici choisi de créer plusieurs sociétés, sans jamais engager d&#8217;autre personnes qu&#8217;elle-même (et sans jamais, sur la période considérée, avoir travaillé pour un autre employeur).</li>
<li><strong>&#8220;Salarié partagé&#8221;&nbsp;: </strong>l&#8217;observation d&#8217;un certain nombre de ces cas montre également des groupes d&#8217;entreprises dont l&#8217;essentiel de l&#8217;activité est basée sur des personnes non-salariées et qui se partagent un salarié pour accomplir des tâches administratives. On trouve ainsi beaucoup de fabriques d&#8217;églises, ou des syndics de copropriétés, mais également des sociétés créées par des indépendants, non par pour s&#8217;y engager eux-mêmes, mais pour y engager une personne à temps partiel.</li>
</ul>
</li>
</ul>
<ul style="text-align: justify;">
<li><strong>&#8220;Entreprise étrangère temporaire&#8221;</strong>&nbsp;: Une série importante de &#8220;clusters&#8221; nous faisant penser à un groupe de travailleurs étrangers, venus en Belgique pour créer une société, puis repartir peu de temps après. Le fait qu&#8217;il s&#8217;agisse de travailleurs &#8220;temporaires&#8221; explique qu&#8217;ils n&#8217;aient pas d&#8217;autres relations dans Dimona, leur historique de travail s&#8217;étant déroulé à l&#8217;étranger. Quelques éléments en attestent. On trouve&nbsp;:
<ul>
<li>Des schémas avec essentiellement des travailleurs étrangers&nbsp;: plus de 2000 clusters sans aucun travailleur ayant la nationalité belge,</li>
<li>620 clusters avec aucun travailleur ayant un numéro NISS, mais uniquement un numéro BIS. Il s&#8217;agit donc de travailleurs temporaires. (cf <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/#NISS_BIS">explications dans notre premier article</a>)</li>
<li>224 clusters où il s&#8217;est écoulé moins d&#8217;un an entre le premier engagement et la fin du dernier contrat. Pour 320 cas, il y a eu moins de deux ans.</li>
</ul>
</li>
<li><strong>&#8220;Travailleurs très fidèles&#8221;</strong>&nbsp;: Une quarantaine de cas d&#8217;entreprises avec entre 5 et 9 travailleurs, presque tous avec un numéro NISS. Nous sommes donc dans le cas d&#8217;entreprise avec un personnel très fidèle&nbsp;: sur 15 ans, aucun des travailleurs n&#8217;a eu d&#8217;autre employeur que celui-là.</li>
</ul>
<h1 style="text-align: justify;">Fidélité</h1>
<p style="text-align: justify;">Une partie des composantes connexes nous donnent des exemples d&#8217;entreprises avec un personnel très fidèle. Une autre façon de le calculer est de recherche des entreprises où il y a une longue période durant lequel tout le personnel qui a un jour été présent a travaillé simultanément. Autrement dit, entre l&#8217;engagement le plus tardif et le premier départ, il s&#8217;est écoulé une longue période.</p>
<p style="text-align: justify;">On trouve par exemple 103 entreprises d&#8217;au moins 5 travailleurs où ce délai est de 10 ans, et 353 entreprises où ce délai est de 5 ans.</p>
<p style="text-align: justify;"><span class="collapseomatic " id="id69d7dd2a5150a"  tabindex="0" title="Requête Cypher"    >Requête Cypher</span><div id="target-id69d7dd2a5150a" class="collapseomatic_content "></p>
<p style="text-align: justify;"><code>MATCH (n:Company)-[r]-()</code><br />
<code>WHERE size( (n)--())&gt;=5</code><br />
<code>WITH n, MIN(toInteger(r.DAYS_SINCE_START)) - MAX(toInteger(r.DAYS_SINCE_END)) AS delay</code><br />
<code>WHERE delay&gt; 3650 </code><br />
<code>RETURN count(n)</code></p>
<p style="text-align: justify;"></div></p>
<h1 style="text-align: justify;">2. Détection de Communautés</h1>
<p style="text-align: justify;">En général, quand on observe un réseau, on constate qu&#8217;il n&#8217;est pas &#8220;uniforme&#8221;&nbsp;: il y a des &#8220;zones&#8221; plus denses, avec beaucoup de connexions entre les nœuds de ces zones, et il y a moins de connexions entre deux nœuds faisant partie de &#8220;zones&#8221; distinctes. Dans la terminologie de la théorie des graphes, on parle de &#8220;communautés&#8221;. Typiquement, si on regarde le réseau constitué de l&#8217;ensemble des connaissances d&#8217;une personne, où un lien entre deux personnes indiquent qu&#8217;elles se connaissent, on observera en général une série de communautés, correspondant à des groupes de la vie réelle par rapport à la personne dont on analyse le réseau&nbsp;: les membres de famille, les collègues, les camarades de classe &#8230; Plus de détails <a href="/ce-quun-reseau-social-peut-nous-apprendre/">peuvent être trouvés dans ce blog</a>.</p>
<p style="text-align: justify;">Nous avons appliqué un algorithme de détection de communautés (<a href="https://en.wikipedia.org/wiki/Label_Propagation_Algorithm">méthode par propagation de labels</a>) sur notre graphe, et avons regardé dans quelle mesure on pouvait caractériser les différentes communautés. Pour ce faire, nous avons examiné deux caractéristiques de chaque entreprise (la province de son siège social et son ou <a href="/le-marche-du-travail-salarie-en-belgique-une-analyse-reseau-partie-1/">ses code(s) NACE</a>), pour comparer la distribution de ces données au sein d&#8217;une communauté par rapport à la distribution pour l&#8217;ensemble de la population.</p>
<p style="text-align: justify;">Nous constatons que la plupart des communautés détectées par l&#8217;algorithme ont un &#8220;comportement&#8221; assez éloigné de la moyenne nationale. Ce qui veut dire que les travailleurs, lorsqu&#8217;ils changent de travail, ont tendance à changer soit pour un employeur localisé dans la même province, soit travaillant dans le même secteur. Ce n&#8217;est en soi pas une découverte surprenante, mais l&#8217;analyse réseau permet de le formaliser.</p>
<p><figure id="attachment_11693" aria-describedby="caption-attachment-11693" style="width: 688px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/05/com_1.jpg"><img loading="lazy" decoding="async" class="wp-image-11693 size-large" src="/wp-content/uploads/2018/05/com_1-1024x535.jpg" alt="" width="688" height="359" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/05/com_1-1024x535.jpg 1024w, https://www.smalsresearch.be/wp-content/uploads/2018/05/com_1-1536x803.jpg 1536w, https://www.smalsresearch.be/wp-content/uploads/2018/05/com_1-300x157.jpg 300w, https://www.smalsresearch.be/wp-content/uploads/2018/05/com_1-768x401.jpg 768w, https://www.smalsresearch.be/wp-content/uploads/2018/05/com_1.jpg 1577w" sizes="auto, (max-width: 688px) 100vw, 688px" /></a><figcaption id="caption-attachment-11693" class="wp-caption-text">Première communauté détectée par l&#8217;algorithme de &#8220;Label propagation&#8221;. Les colonnes bleues indiquent la proportion d&#8217;entreprise localisée dans la province de la colonne en Belgique, les colonnes orange cette même proportion dans la communauté représentée.</figcaption></figure></p>
<p style="text-align: justify;">Les données des 100 plus grosses communautés <a href="/wp-content/uploads/2018/05/communities.pdf" target="_blank" rel="noopener">sont visibles dans ce document.</a> On peut par exemple y voir que la plus grande communauté détectée (54.000 employeurs, 750.000 travailleurs) est composée très largement d&#8217;entreprises localisées en Flandre Occidentale. En effet, comme le montre le graphique ci-dessus, alors que 10% des entreprises en Belgique sont localisées dans cette province (colonne bleue), 71% des entreprises de la communauté concernées y sont. Dans le même ordre d&#8217;idées, la troisième communauté comprend trois fois plus d&#8217;entreprises de l&#8217;<a href="https://fr.wikipedia.org/wiki/Horeca">Horeca</a> (Hotels, restaurants, cafés) que la moyenne nationale.</p>
<p style="text-align: justify;">La 8<sup>ème</sup> communauté, représentée ci-dessous, combine deux aspects&nbsp;: les 580 entreprises qui la composent sont quasi exclusivement localisée en Wallonie et à Bruxelles (soit les deux régions de Belgique où l&#8217;on parle majoritairement français), et travaillent dans le secteur de l&#8217;enseignement.</p>
<h1 style="text-align: justify;"><a href="/wp-content/uploads/2018/05/com_8.jpg"><img loading="lazy" decoding="async" class="alignleft size-large wp-image-11694" src="/wp-content/uploads/2018/05/com_8-969x1024.jpg" alt="" width="688" height="727" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/05/com_8-969x1024.jpg 969w, https://www.smalsresearch.be/wp-content/uploads/2018/05/com_8-284x300.jpg 284w, https://www.smalsresearch.be/wp-content/uploads/2018/05/com_8-768x812.jpg 768w, https://www.smalsresearch.be/wp-content/uploads/2018/05/com_8.jpg 1059w" sizes="auto, (max-width: 688px) 100vw, 688px" /></a>La suite&#8230;</h1>
<p style="text-align: justify;">Dans le troisième blog de cette série, nous examinerons deux notions&nbsp;: celle d&#8217;homophilie, et celle de projection. La première nous permettra de voir à quel point les travailleurs changent de région de travail ou de domaine d&#8217;activité. La seconde permettra de calculer un certaine forme de proximité entre deux travailleurs, au travers du nombre d&#8217;employeurs qu&#8217;ils ont eu en commun.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
