Semantic Web ΠΈ Linked Data ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ Π±Π»ΠΈΠΆΠ½Π΅ΠΌΡ ΠΊΠΎΡΠΌΠΎΡΡ: ΠΆΠΈΠ·Π½ΠΈ ΡΠ°ΠΌ Π½Π΅Ρ. Π§ΡΠΎΠ±Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡΡΡ ΡΡΠ΄Π° Π½Π°Β Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΡΠΎΠΊβ¦ Π½Ρ, Π½Π΅ Π·Π½Π°Ρ, ΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ Π²Π°ΠΌ Π² Π΄Π΅ΡΡΡΠ²Π΅ Π² ΠΎΡΠ²Π΅Ρ Π½Π° Β«Ρ ΠΎΡΡ ΡΡΠ°ΡΡ ΠΊΠΎΡΠΌΠΎΠ½Π°Π²ΡΠΎΠΌΒ». ΠΠΎ ΠΏΠΎΠ½Π°Π±Π»ΡΠ΄Π°ΡΡ Π·Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½Π°Ρ ΠΎΠ΄ΡΡΡ Π½Π° ΠΠ΅ΠΌΠ»Π΅; ΡΡΠ°ΡΡ Π°ΡΡΡΠΎΠ½ΠΎΠΌΠΎΠΌ-Π»ΡΠ±ΠΈΡΠ΅Π»Π΅ΠΌ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΠΎΠΌ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΏΡΠΎΡΠ΅.
Π ΡΡΠ°ΡΡΠ΅ ΡΠ΅ΡΡ ΠΏΠΎΠΉΠ΄Π΅Ρ ΠΎ ΡΠ²Π΅ΠΆΠΈΡ , Π½Π΅ ΡΡΠ°ΡΠ΅Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΌΠ΅ΡΡΡΠ΅Π², ΡΡΠ΅Π½Π΄Π°Ρ ΠΈΠ· ΠΌΠΈΡΠ° RDF-Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡ. ΠΠ΅ΡΠ°ΡΠΎΡΠ° Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π°Π±Π·Π°ΡΠ΅ Π±ΡΠ»Π° Π½Π°Π²Π΅ΡΠ½Π° ΡΠΏΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² ΡΠ΅ΠΊΠ»Π°ΠΌΠ½ΠΎΠΉ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΎΠΉ ΠΏΠΎΠ΄ ΠΊΠ°ΡΠΎΠΌ.
ΠΠΏΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ°
I. GraphQL Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ RDF
Β«ΠΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈΒ» ΡΠ°ΠΊΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ:
- Stardog (
Π±Π»ΠΎΠ³ ,Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ); - ΠΏΡΠΎΠ΄ΡΠΊΡΡ TopQuadrant (
Π²Π΅Π±ΠΈΠ½Π°Ρ ,Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ).
ΠΡΠ»ΠΈ ΠΆΠ΅ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΡΠ°ΠΊΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ, Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, Π½Π°ΠΏΠΈΡΠ°Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Β«ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅Π»ΡΒ» (resolver). Π’Π°ΠΊ ΠΏΠΎΡΡΡΠΏΠΈΠ»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎ ΡΡΠ°Π½ΡΡΠ·ΡΠΊΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅
Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΎΡΡΠΎΠ΄ΠΎΠΊΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ²Π΅ΡΠΆΠ΅Π½ΡΠ° Semantic Web ΠΈ Linked Data Π²ΡΡ ΡΡΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΠ΅ΡΠ°Π»ΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΌ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΉ, Π²ΡΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΡ Π²ΠΎΠΊΡΡΠ³ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΡ data silo, Π° Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΠΏΠ»Π°ΡΡΠΎΡΠΌ (ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ, RDF-Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡ).
ΠΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΡ ΠΎΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ GraphQL ΡΠΎ SPARQL ΠΎΡΡΠ°ΡΡΡΡ Π΄Π²ΠΎΡΠΊΠΈΠ΅.
- Π‘ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, GraphQL Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π΄Π°Π»ΡΠ½ΠΈΠΌ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΈΠΊΠΎΠΌ SPARQL: Π² Π½Π΅ΠΌ ΡΠ΅ΡΠ΅Π½Ρ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π΄Π»Ρ REST ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠ΅ΡΠ΅Π²ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ² β Π±Π΅Π· ΡΠ΅Π³ΠΎ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΠΈ Π½Π΅Π»ΡΠ·Ρ Π±ΡΠ»ΠΎ Π±Ρ ΡΡΠΈΡΠ°ΡΡΡΡ ΡΠ·ΡΠΊΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠ², Ρ ΠΎΡΡ Π±Ρ ΠΈ Π΄Π»Ρ Π²Π΅Π±Π°;
- Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΎΠ³ΠΎΡΡΠ°Π΅Ρ ΠΆΠ΅ΡΡΠΊΠ°Ρ ΡΡ Π΅ΠΌΠ½ΠΎΡΡΡ GraphQL. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π΅Π³ΠΎ Β«ΠΈΠ½ΡΡΠΎΡΠΏΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΒ» ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΉ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ Ρ ΠΏΠΎΠ»Π½ΠΎΠΉ ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΡ RDF. Π Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΎΠ³Π° property paths, ΡΠ°ΠΊ ΡΡΠΎ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΎΠ½ Β«Graph-Β».
II. ΠΠ΄Π°ΠΏΡΠ΅ΡΡ ΠΊ MongoDB
Π’ΡΠ΅Π½Π΄, ΠΊΠΎΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠ½ΡΠΉ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌΡ.
- Π² Stardog ΡΠ΅ΠΏΠ΅ΡΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ β Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π²ΡΠ΅ Π½Π° ΡΠΎΠΌ ΠΆΠ΅ GraphQL β Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ MongoDB Π² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ RDF-Π³ΡΠ°ΡΡ; - GraphDB Ρ Π½Π΅Π΄Π°Π²Π½ΠΈΡ
ΠΏΠΎΡ
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΡΠ°Π²Π»ΡΡΡ Π² SPARQL ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ Π½Π° MongoDB Query.
ΠΡΠ»ΠΈ Π³ΠΎΠ²ΠΎΡΠΈΡΡ ΡΠΈΡΠ΅, ΠΎΠ± Π°Π΄Π°ΠΏΡΠ΅ΡΠ°Ρ
ΠΊ JSON-ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΡ
Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Β«Π½Π° Π»Π΅ΡΡΒ» ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ Ρ
ΡΠ°Π½ΡΡΠΈΠΉΡΡ Π² ΡΡΠΈΡ
ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°Ρ
JSON ΠΊΠ°ΠΊ RDF, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π΄Π°Π²Π½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ
Π Π΅Π·ΡΠΌΠΈΡΡΡ ΠΏΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π° ΡΡΠ΅Π½Π΄Π°, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ RDF-Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ ΠΏΠΎΠ»Π½ΡΡ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΡ ΠΊ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠΌ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡ
Β«ΠΌΠ½ΠΎΠ³ΠΎΠ²Π°ΡΠΈΠ°Π½ΡΠ½ΠΎΠ³ΠΎ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡΒ» (polyglot persistence). ΠΠ·Π²Π΅ΡΡΠ½ΠΎ, Π²ΠΏΡΠΎΡΠ΅ΠΌ, ΡΡΠΎ ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΡΠΆΠ΅ Π΄Π°Π²Π½ΠΎ Π½Π΅ Π² ΠΌΠΎΠ΄Π΅, ΠΈ Π½Π° ΡΠΌΠ΅Π½Ρ Π΅ΠΌΡ
ΠΡΠ»ΠΈ Π²ΠΊΡΠ°ΡΡΠ΅, ΡΠΎ Π½ΠΈΠΊΠ°ΠΊ. Π’Π΅ΠΌΠ΅ ΠΌΡΠ»ΡΡΠΈΠΌΠΎΠ΄Π΅Π»ΡΠ½ΡΡ
Π‘Π£ΠΠ Ρ
ΠΎΡΠ΅ΡΡΡ ΠΏΠΎΡΠ²ΡΡΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΠ°ΡΡΡ, ΠΏΠΎΠΊΠ° ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΌΡΠ»ΡΡΠΈΠΌΠΎΠ΄Π΅Π»ΡΠ½ΡΡ
Π‘Π£ΠΠ, Β«ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ
Β» Π½Π° Π³ΡΠ°ΡΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ (ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΡΡ Π΅Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ RDF), ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅Ρ. Π Π½Π΅ΠΊΠΎΠ΅ΠΉ ΠΌΠ°Π»ΠΎΠΉ ΠΌΡΠ»ΡΡΠΈΠΌΠΎΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ β ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ RDF-Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΠΌΠΈ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΎΠΉ Π³ΡΠ°ΡΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ LPG β Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΊΠ°Π·Π°Π½ΠΎ Π²
III. OLTP vs. OLAP
ΠΠΏΡΠΎΡΠ΅ΠΌ, ΡΠΎΡ ΠΆΠ΅ Gartner
ΠΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ Π³Π΄Π΅ Π½Π° ΡΠΊΠ°Π»Π΅ OLTPβOLAP Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ RDF-Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°? Π― Π±Ρ ΠΎΡΠ²Π΅ΡΠΈΠ» ΡΠ°ΠΊ: Π½ΠΈ ΡΠ°ΠΌ, Π½ΠΈ ΡΡΡ. ΠΠ»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΠΊ ΡΠ΅ΠΌΡ ΠΎΠ½ΠΈ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ, Π½ΡΠΆΠ½Π° ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΡΡΠ΅ΡΡΡ Π°Π±Π±ΡΠ΅Π²ΠΈΠ°ΡΡΡΠ°. ΠΠ°ΠΊ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» Π±Ρ OLIP β Online Intellectual Processing.
ΠΠ΄Π½Π°ΠΊΠΎ Π²ΡΠ΅ ΠΆΠ΅:
- ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ Π² GraphDB ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ MongoDB Π½Π΅ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ
ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΠΎΠ±Ρ ΠΎΠ΄Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ Π·Π°ΠΏΠΈΡΠΈ; - Stardog ΠΈΠ΄Π΅Ρ Π΅ΡΡ Π΄Π°Π»ΡΡΠ΅ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ
ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΄Π²ΠΈΠΆΠΎΠΊ, ΠΎΠΏΡΡΡ-ΡΠ°ΠΊΠΈ Ρ ΡΠ΅Π»ΡΡ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π·Π°ΠΏΠΈΡΠΈ.
Π ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°Π·ΡΠ΅ΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠ³ΡΠΎΠΊΠ° Π½Π° ΡΡΠ½ΠΊΠ΅. ΠΎΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Π΅ΠΉ IBM Netezza ΠΈ Amazon Redshift β
SELECT ?month (COUNT(?event) OVER (PARTITION BY ?month) AS ?events) WHERE { β¦ }
IV. RocksDB
ΠΡΡΠ΅ ΡΠΆΠ΅
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, cΡΠ΄Ρ ΠΏΠΎ
ΠΠΎ-Π²ΡΠΎΡΡΡ , Π½Π° RocksDB Π΄Π΅Π»Π°ΡΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΡ (Ρ. Π΅. Π½Π΅ ΠΏΡΠΎΠ΄ΡΠΊΡΡ) ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠΈ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, eBay ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ RocksDB Π²
ΠΡΡΠ³ΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ β ΠΏΠΎΡΠ²ΠΈΠ²ΡΠΈΠΉΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΡΡΠ΅Π² Π½Π°Π·Π°Π΄
V. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° LPG
ΠΠ°ΠΏΠΎΠΌΠ½Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ LPG-Π³ΡΠ°ΡΠΎΠ² ΠΎΡ RDF-Π³ΡΠ°ΡΠΎΠ².
Π LPG Π½Π° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΠ΅Π±Π΅Ρ ΠΌΠΎΠ³ΡΡ Π½Π°Π²Π΅ΡΠΈΠ²Π°ΡΡΡΡ ΡΠΊΠ°Π»ΡΡΠ½ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Π² RDF ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π½Π°Π²Π΅ΡΠΈΠ²Π°ΡΡΡΡ Π»ΠΈΡΡ Π½Π° Β«ΡΠΈΠΏΡΒ» ΡΠ΅Π±Π΅Ρ (Π·Π°ΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ°Π»ΡΡΠ½ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, Π½ΠΎ ΠΈ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΠ²ΡΠ·ΠΈ). ΠΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΡΡΡ RDF ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ LPG
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, Π·Π°Π΄Π°ΡΠ° Β«ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ LPGΒ» ΡΠ°ΡΠΏΠ°Π΄Π°Π΅ΡΡΡ Π½Π° Π΄Π²Π΅ ΡΠ°ΡΡΠΈ:
- Π²Π½Π΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΌΠΎΠ΄Π΅Π»Ρ RDF ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π΄Π°ΡΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π² Π½Π΅ΠΉ LPG-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ;
- Π²Π½Π΅ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠ·ΡΠΊ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ RDF ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π΄Π°ΡΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Π΄Π°Π½Π½ΡΠΌ Π² ΡΡΠΎΠΉ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, β Π»ΠΈΠ±ΠΎ ΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π΅Π»Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΡΡΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΡΠ·ΡΠΊΠ°Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ LPG.
V.1. ΠΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ
ΠΠ΄Π΅ΡΡ ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠ².
V.1.1. Singleton Property
Π‘Π°ΠΌΡΠΉ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΡΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΊ Π³Π°ΡΠΌΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ RDF ΠΈ LPG β ΡΡΠΎ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅,
- ΠΠΌΠ΅ΡΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ°
:isMarriedTo
ΡΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡΡΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ:isMarriedTo1
,:isMarriedTo2
ΠΈ Ρ. Π΄. - ΠΠ°ΡΠ΅ΠΌ ΡΡΠΈ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΡΡΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ Π½ΠΎΠ²ΡΡ
ΡΡΠΈΠΏΠ»Π΅ΡΠΎΠ²:
:isMarriedTo1 :since "2013-09-13"^^xsd:date
ΠΈ ΠΏΡ. - Π‘Π²ΡΠ·Ρ ΡΡΠΈΡ
ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠΎΠ² Ρ ΠΎΠ±ΡΠΈΠΌ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠΎΠΌ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠΈΠΏΠ»Π΅ΡΠ°ΠΌΠΈ Π²ΠΈΠ΄Π°
:isMarriedTo1 rdf:singletonPropertyOf :isMarriedTo
. - ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ
rdf:singletonPropertyOf rdfs:subPropertyOf rdf:type
, Π½ΠΎ ΠΏΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅, ΠΏΠΎΡΠ΅ΠΌΡ Π½Π΅ ΡΡΠΎΠΈΡ ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΡΡΠΎ:isMarriedTo1 rdf:type :isMarriedTo
.
ΠΠ°Π΄Π°ΡΠ° Β«ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ LPGΒ» ΡΠ΅ΡΠ°Π΅ΡΡΡ Π·Π΄Π΅ΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ RDFS. Π’Π°ΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ
V.1.2. Reification Done Right
ΠΠ΅Π½Π΅Π΅ Π½Π°ΠΈΠ²Π½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ ΠΏΡΠΎΠΈΡΡΠ΅ΠΊΠ°ΡΡ ΠΈΠ· ΠΎΡΠΎΠ·Π½Π°Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ² Π²ΠΏΠΎΠ»Π½Π΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈΡΡΡΡΡΡ ΡΡΠΈΠΏΠ»Π΅ΡΠ°ΠΌΠΈ. ΠΠΌΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π³ΠΎΠ²ΠΎΡΠΈΡΡ ΡΡΠΎ-ΡΠΎ ΠΎ ΡΡΠΈΠΏΠ»Π΅ΡΠ°Ρ , ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π³ΠΎΠ²ΠΎΡΠΈΡΡ ΠΈ ΠΎΠ± ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°Ρ ΡΠ²ΠΎΠΉΡΡΠ².
Π‘Π°ΠΌΡΠΉ ΡΠΎΠ»ΠΈΠ΄Π½ΡΠΉ ΠΈΠ· ΡΡΠΈΡ
ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΎΠ² β
<<:bob :isMarriedTo :alice>> :since "2013-09-13"^^xsd:date .
V.1.3. ΠΡΠΎΡΠΈΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ
ΠΠΎΠΆΠ½ΠΎ Π½Π΅ Π·Π°ΠΌΠΎΡΠ°ΡΠΈΠ²Π°ΡΡΡΡ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΎΠΉ, Π° ΠΏΡΠΎΡΡΠΎ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ Ρ ΡΡΠΈΠΏΠ»Π΅ΡΠΎΠ² Π΅ΡΡΡ Π½Π΅ΠΊΠΈΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ, ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, URI, ΠΈ ΡΠΎΡΡΠ°Π²Π»ΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΡΠΈΠΏΠ»Π΅ΡΡ Ρ ΡΡΠΈΠΌΠΈ URI. ΠΡΡΠ°Π½Π΅ΡΡΡ Π»ΠΈΡΡ Π΄Π°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠΈΠΌ URI Π² SPARQL. Π’Π°ΠΊ
Π Allegrograph
:bob :marriedTo :alice {"since" : "2013-09-13"}
V.2. Π―Π·ΡΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ²
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠ°Π² ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ LPG Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π½ΡΠΆΠ½ΠΎ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π΅Π»Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΊ Π΄Π°Π½Π½ΡΠΌ Π² ΡΠ°ΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ.
- Blazegraph Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ RDF* ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ
SPARQL* ΠΈGremlin . ΠΠ°ΠΏΡΠΎΡ Π½Π° SPARQL* Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
SELECT * { <<:bob :isMarriedTo ?wife>> :since ?since }
- Anzograph ΡΠΎΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ
SPARQL* ΠΈ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡCypher , ΡΠ·ΡΠΊ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π² Neo4j. - Stardog ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ΅
ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ SPARQL ΠΈΠΎΠΏΡΡΡ-ΡΠ°ΠΊΠΈ Gremlin. ΠΠΎΠ»ΡΡΠΈΡΡ Π² SPARQL URI ΡΡΠΈΠΏΠ»Π΅ΡΠ° ΠΈ Β«ΠΌΠ΅ΡΠ°ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΒ» ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ:
SELECT * {
BIND (stardog:identifier(:bob, :isMarriedTo, ?wife) AS ?id)
?id :since ?since
}
- Allegrograph ΡΠΎΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ΅
ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ SPARQL:
SELECT * { ("since" ?since) franz:attributesNameValue ( :bob :marriedTo ?wife ) }
ΠΡΡΠ°ΡΠΈ, GraphDB ΠΎΠ΄Π½ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π»Π° Tinkerpop/Gremlin, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Ρ ΠΏΡΠΈ ΡΡΠΎΠΌ LPG, Π½ΠΎ Π² Π²Π΅ΡΡΠΈΠΈ 8.0 ΠΈΠ»ΠΈ 8.1 ΡΡΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΠ»ΠΎΡΡ.
VI. Π£ΠΆΠ΅ΡΡΠΎΡΠ΅Π½ΠΈΠ΅ Π»ΠΈΡΠ΅Π½Π·ΠΈΠΉ
ΠΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΡΠΈΠ±Π°Π²Π»Π΅Π½ΠΈΠΉ Π² ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ² Β«triplestore of choiceΒ» ΠΈ Β«open source triplestoreΒ» Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π½Π΅ ΡΠ»ΡΡΠ°Π»ΠΎΡΡ. ΠΠΎΠ²ΡΠΌ RDF-Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΠΌ Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π°Π»Π΅ΠΊΠΎ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΡΠ°ΡΡ Ρ ΠΎΡΠΎΡΠΈΠΌ Π²ΡΠ±ΠΎΡΠΎΠΌ Π΄Π»Ρ ΠΏΠΎΠ²ΡΠ΅Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Π° ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π½ΠΎΠ²ΡΡ RDF-Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΏΠΎΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ (ΡΠΎΠ³ΠΎ ΠΆΠ΅ AnzoGraph), Π·Π°ΠΊΡΡΡ. Π‘ΠΊΠΎΡΠ΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡΡ Π΄Π°ΠΆΠ΅ ΠΎΠ± ΡΠ±Π°Π²Π»Π΅Π½ΠΈΡΡ β¦
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΠΎΡΠΊΡΡΡΡΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π½Π΅ Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ, Π½ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° c ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅ΡΡΠ°ΡΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π΄ΠΎΡΡΠΎΠΉΠ½ΡΠ΅ Π²ΡΠ±ΠΎΡΠ°. Virtuoso, ΠΈΠΌΠ΅ΡΡΠΈΠΉ opensource-ΡΠ΅Π΄Π°ΠΊΡΠΈΡ, Π½Π° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, ΡΠΎΠ½Π΅Ρ Π² Π±Π°Π³Π°Ρ . Blazegraph ΠΊΡΠΏΠ»Π΅Π½ AWS ΠΈ Π»Π΅Π³ Π² ΠΎΡΠ½ΠΎΠ²Ρ Amazon Neptune; ΡΠ΅ΠΏΠ΅ΡΡ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ, Π±ΡΠ΄Π΅Ρ Π»ΠΈ Π΅ΡΠ΅ Ρ ΠΎΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ΅Π»ΠΈΠ·. ΠΡΡΠ°Π΅ΡΡΡ Π»ΠΈΡΡ Jenaβ¦
ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΎΡΠΊΡΡΡΡΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ΅Π½, Π° Ρ ΠΎΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ, ΡΠΎ Π²ΡΡ ΡΠΎΠΆΠ΅ ΠΌΠ΅Π½Π΅Π΅ ΡΠ°Π΄ΡΠΆΠ½ΠΎ, ΡΠ΅ΠΌ ΡΠ°Π½ΡΡΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
- Stardog
ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅Ρ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΡ Π²Π΅ΡΡΠΈΡ (Π²ΠΏΡΠΎΡΠ΅ΠΌ, Π²ΡΡΠΎΡ Π² Π΄Π²Π° ΡΠ°Π·Π° ΠΏΡΠΎΠ±Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ ΠΎΠ±ΡΡΠ½ΠΎΠΉ); - Π²
GraphDB Cloud , Π³Π΄Π΅ ΡΠ°Π½ΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π²ΡΠ±ΡΠ°ΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠΉ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΏΠ»Π°Π½, ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π½ΠΎΠ²ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ .
Π ΠΎΠ±ΡΠ΅ΠΌ, Π΄Π»Ρ ΡΡΠ΄ΠΎΠ²ΠΎΠ³ΠΎ ΠΠ’-ΠΎΠ±ΡΠ²Π°ΡΠ΅Π»Ρ ΠΊΠΎΡΠΌΠΎΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π²ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΈ Π±ΠΎΠ»Π΅Π΅ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ, ΠΎΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ Π΅Π³ΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ΄Π΅Π»ΠΎΠΌ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠΉ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com