A 'chiad bheachdan air Amazon Neptune

Fàilte, luchd-còmhnaidh Habr. Ron thòiseachadh air a’ chùrsa. "AWS airson luchd-leasachaidh" Tha sinn air eadar-theangachadh de stuth inntinneach ullachadh.

A 'chiad bheachdan air Amazon Neptune

Ann am mòran chùisean cleachdaidh a bhios sinn, mar dàta-bacaidhChì sinn air làraichean-lìn ar luchd-dèiligidh gu bheil fiosrachadh buntainneach falaichte anns na dàimhean eadar eintiteasan, mar eisimpleir, nuair a thathar a’ dèanamh anailis air dàimhean eadar luchd-cleachdaidh, eisimeileachd eadar eileamaidean, no ceanglaichean eadar mothachairean. Mar as trice bidh cùisean cleachdaidh mar sin air am modaladh air graf. Na bu thràithe am-bliadhna, leig Amazon a-mach stòr-dàta grafa ùr, Neptune. Anns a’ phost seo, tha sinn airson ar beachdan tùsail, ar cleachdaidhean as fheàrr, agus na dh’ fhaodadh a bhith air a leasachadh thar ùine a cho-roinn.

Carson a dh’ fheumas sinn Amazon Neptune

Tha stòran-dàta grafa a’ gealltainn gum bi iad a’ làimhseachadh seataichean dàta ceangailte nas fheàrr na an co-aoisean dàimheil. Ann an seataichean dàta mar sin, mar as trice bidh fiosrachadh buntainneach air a stòradh anns na dàimhean eadar nithean. Gus Neptune a dhearbhadh, chleachd sinn pròiseact dàta fosgailte iongantach. CeòlBrainzBidh MusicBrainz a’ tional a h-uile meata-dhàta a ghabhas smaoineachadh mu cheòl, leithid fiosrachadh mu luchd-ealain, òrain, clàran-foillseachaidh, no cuirmean-ciùil, a bharrachd air cò leis a bha an neach-ealain ag obair còmhla, no cuin a chaidh an clàr fhoillseachadh agus anns dè an dùthaich. Faodar smaoineachadh air MusicBrainz mar lìonra mòr de bhuidhnean a tha ceangailte ri gnìomhachas a’ chiùil ann an dòigh air choireigin.

Tha an seata dàta MusicBrainz air a thoirt seachad mar dhump CSV de stòr-dàta dàimheil. Gu h-iomlan, tha timcheall air 93 millean sreath anns an dump ann an 157 clàr. Ged a tha dàta bunaiteach ann an cuid de na clàran seo leithid luchd-ealain, tachartasan, clàraidhean, fiosan, no slighean, tha cuid eile… clàran ceangail — a’ stòradh dhàimhean eadar luchd-ealain agus clàraidhean, luchd-ealain no fiosan eile, agus mar sin air adhart. Bidh iad a’ sealltainn structar grafa an t-seata dàta. Nuair a thionndaidh sinn an seata dàta gu trì-fhilltean RDF, fhuair sinn timcheall air 500 millean eisimpleir.

Stèidhichte air an eòlas agus am fios-air-ais bho na com-pàirtichean pròiseict leis a bheil sinn ag obair, tha sinn a’ faicinn suidheachadh anns am bi am bunait eòlais seo air a chleachdadh gus fiosrachadh ùr fhaighinn. A bharrachd air sin, tha sinn a’ faicinn gun tèid ùrachadh a dhèanamh air gu cunbhalach, mar eisimpleir, le bhith a’ cur fiosan ùra ris no ag ùrachadh buill na buidhne.

adjustment

Mar a bha dÚil, tha stàladh Amazon Neptune sÏmplidh. Tha e gu math mionaideach. clàraichteFaodaidh tu stòr-dàta grafa a chur air bhog le dÏreach beagan chlican. Ach, nuair a thig e gu rèiteachadh nas mionaidiche, am fiosrachadh riatanach Tha e duilich a lorg. Mar sin, tha sinn airson aon pharaimeadar rèiteachaidh a chomharrachadh.

A 'chiad bheachdan air Amazon Neptune
Dealbh-sgrÏn rèiteachaidh airson buidhnean paramadair

Tha Amazon ag ràdh gu bheil Neptune ag amas air luchdan obrach malairteach le dàil ìosal, agus mar sin is e 120 diogan an ùine-ama bunaiteach airson iarrtasan. Ach, rinn sinn deuchainn air grunn chùisean cleachdaidh anailis anns an robh sinn a’ ruighinn na crìche seo gu cunbhalach. Faodar an ùine-ama seo atharrachadh le bhith a’ cruthachadh buidheann paramadair ùr airson Neptune agus ga shuidheachadh gu neptune_query_timeout an cuingealachadh co-fhreagarrach.

A’ luchdachadh dàta

Gu h-ĂŹosal bruidhnidh sinn gu mionaideach air mar a luchdaich sinn dĂ ta MusicBrainz a-steach do Neptune.

DĂ imhean ann an triĂšir

An toiseach, thionndaidh sinn dàta MusicBrainz gu trì-fhilltean RDF. Mar sin, airson gach clàr, mhìnich sinn teamplaid a dh’innseas mar a tha gach colbh air a riochdachadh san trì-fhillte. San eisimpleir seo, tha gach sreath bhon chlàr neach-ealain air a mhapadh gu dà-fhilltean RDF deug.

<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/gid> "${gid}"^^<http://www.w3.org/2001/XMLSchema#string> .
 
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/name> "${name}"^^<http://www.w3.org/2001/XMLSchema#string> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/sort-name> "${sort_name}"^^<http://www.w3.org/2001/XMLSchema#string> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/begin-date> "${begin_date_year}-${begin_date_month}-${begin_date_day}"^^xsd:<http://www.w3.org/2001/XMLSchema#date> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/end-date> "${end_date_year}-${end_date_month}-${end_date_day}"^^xsd:<http://www.w3.org/2001/XMLSchema#date> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/type> <http://musicbrainz.foo/artist-type/${type}> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/area> <http://musicbrainz.foo/area/${area}> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/gender> <http://musicbrainz.foo/gender/${gender}> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/comment> "${comment}"^^<http://www.w3.org/2001/XMLSchema#string> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/edits-pending> "${edits_pending}"^^<http://www.w3.org/2001/XMLSchema#int> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/last-updated> "${last_updated}"^^<http://www.w3.org/2001/XMLSchema#dateTime> .
 
<http://musicbrainz.foo/artist/${id}> <http://musicbrainz.foo/ended> "${ended}"^^<http://www.w3.org/2001/XMLSchema#boolean> .

Luchdaich suas ann am mòr-chuid

Is e am pròiseas luchdachadh suas mòr tro S3 an dòigh a thathar a’ moladh airson meudan mòra dàta a luchdachadh suas gu Neptune. Às dèidh dhut na faidhlichean trì-fhillte agad a luchdachadh suas gu S3, tòisichidh tu air an luchdachadh suas le iarrtas POST. Nar cùis-ne, thug seo timcheall air 24 uair a thìde airson 500 millean trì-fhillte. Bha dùil againn gum biodh e nas luaithe.

curl -X POST -H 'Content-Type: application/json' http://your-neptune-cluster:8182/loader -d '{
 
 
 "source" : "s3://your-s3-bucket",
 
 "format" : "ntriples",
 
 "iamRoleArn" : "arn:aws:iam::your-iam-user:role/NeptuneLoadFromS3",
 
 "region" : "eu-west-1",
 
 "failOnError" : "FALSE"
 
}'

Gus am pròiseas fada seo a sheachnadh a h-uile uair a chuireas sinn Neptune air bhog, chuir sinn romhainn an eisimpleir ath-nuadhachadh bho dealbh-sgrÏn leis na trÏ-fhilltean seo air an luchdachadh mu thràth. Tha cur air bhog bho dealbh-sgrÏn gu math nas luaithe, ach bheir e fhathast timcheall air uair a thÏde airson Neptune a bhith ri fhaighinn airson iarrtasan.

Nuair a bha sinn a’ luchdachadh trì-fhilltean a-steach do Neptune an toiseach, thachair sinn ri grunn mhearachdan.

{
 
 
 "errorCode" : "PARSING_ERROR",
 
 "errorMessage" : "Content after '.' is not allowed",
 
 "fileName" : [...],
 
 "recordNum" : 25
 
}

Bha cuid dhiubh nan mearachdan parsaidh, mar a chithear gu h-àrd. Gus an-diugh, chan eil sinn air faighinn a-mach dè dìreach a chaidh ceàrr aig an ìre seo. Bhiodh beagan a bharrachd fiosrachaidh gu cinnteach na chuideachadh. Thachair a’ mhearachd seo airson timcheall air 1% de na trì-fhilltean a chaidh a chur a-steach. Ach nuair a thig e gu bhith a’ dèanamh deuchainn air Neptune, tha sinn air gabhail ris nach eil sinn ag obair ach le 99% den dàta bho MusicBrainz.

Ged nach eil seo na dhuilgheadas dhaibhsan a tha eòlach air SPARQL, cumaibh cuimhne gum feumar trÏ-fhilltean RDF a bhith air an comharrachadh le seòrsachan dàta soilleir, agus faodaidh seo mearachdan adhbhrachadh a-rithist.

Luchdaich sĂŹos sruthadh

Mar a chaidh ainmeachadh gu h-àrd, chan eil sinn airson Neptune a chleachdadh mar stòr dàta statach, ach mar bhunait eòlais sÚbailte is mean-fhàsach. Mar sin, bha feum againn dòighean a lorg airson trÏ-fhilltean Úra a thoirt a-steach mar a bhios am bunait eòlais ag atharrachadh, mar eisimpleir, nuair a thèid clàr Úr fhoillseachadh no nuair a tha sinn airson eòlas a chaidh a thoirt a-mach a thoirt gu buil.

Tha Neptune a’ toirt taic do ghnìomhaichean cuir-a-steach tro cheistean SPARQL, an dà chuid le dàta amh agus stèidhichte air taghaidhean. Bruidhnidh sinn air an dà dhòigh-obrach gu h-ìosal.

B’ e aon de na h-amasan againn dàta a chuir a-steach ann an dòigh sruthadh. Smaoinich air foillseachadh clàr ann an dùthaich ùr. Bho shealladh MusicBrainz, tha seo a’ ciallachadh, airson foillseachadh, anns a bheil clàran, singiltean, EPan, msaa., gu bheil clàr ùr air a chur ris a’ chlàr. dùthaich-foillseachaidhAnn an RDF, bidh sinn a’ mapadh an fhiosrachaidh seo gu dà thriple ùr.

INSERT DATA { <http://musicbrainz.foo/release-country/737041> <http://musicbrainz.foo/release> <http://musicbrainz.foo/release/435759> };INSERT DATA { <http://musicbrainz.foo/release-country/737041> <http://musicbrainz.foo/date-year> "2018"^^<http://www.w3.org/2001/XMLSchema#int> };

B’ e amas eile eòlas ùr a thoirt a-mach às a’ ghraf. Abair gu bheil sinn airson an àireamh de fhoillseachaidhean a tha gach neach-ealain air fhoillseachadh nan cùrsa-beatha fhaighinn air ais. Tha an ceist seo gu math iom-fhillte agus bheir e còrr is 20 mionaid ann an Neptune, agus mar sin feumaidh sinn an toradh a thoirt gu buil gus an t-eòlas ùr seo ath-chleachdadh ann an ceist eile. Mar sin, cuiridh sinn na trì-fhilltean anns a bheil am fiosrachadh seo air ais ris a’ ghraf le bhith a’ cur a-steach toradh an fho-cheiste.

INSERT {
 
 
  ?artist_credit <http://musicbrainz.foo/number-of-releases> ?number_of_releases
 
} WHERE {
 
  SELECT ?artist_credit (COUNT(*) as ?number_of_releases)
 
  WHERE {
 
     ?artist_credit <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist-credit> .
 
     ?release_group <http://musicbrainz.foo/artist-credit> ?artist_credit .
 
     ?release_group <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/release-group> .
 
     ?release_group <http://musicbrainz.foo/name> ?release_group_name .
 
  }
 
  GROUP BY ?artist_credit
 
}

Bheir e beagan mhÏle-diogan trÏ-fhilltean singilte a chur ri graf, agus tha an Úine cur gu bàs airson toradh fo-cheist a chuir a-steach an urra ri Úine cur gu bàs an fho-cheist fhèin.

Ged nach do chleachd sinn e gu tric, leigidh Neptune leat cuideachd trÏ-fhilltean a thoirt air falbh stèidhichte air sampallan no dàta soilleir, agus faodar an cleachdadh gus am fiosrachadh Úrachadh.

Ceistean SPARQL

Le bhith a’ toirt a-steach an fho-sheata roimhe, a bhios a’ tilleadh an àireamh de fhoillseachaidhean airson gach cleasaiche, tha sinn air a’ chiad sheòrsa ceist a tha sinn airson a fhreagairt a thoirt a-steach le bhith a’ cleachdadh Neptune. Tha togail ceist ann an Neptune sìmplidh—cuir iarrtas POST chun cheann-uidhe SPARQL, mar a chithear gu h-ìosal:

curl -X POST --data-binary 'query=SELECT ?artist ?p ?o where {?artist <http://musicbrainz.foo/name> "Elton John" . ?artist ?p ?o . }' http://your-neptune-cluster:8182/sparql

Tha sinn cuideachd air ceist a chur an gnìomh a thilleas pròifilean luchd-ealain anns a bheil fiosrachadh mun ainm, aois agus dùthaich thùsail aca. Cumaibh cuimhne gum faod luchd-ealain a bhith nan daoine fa leth, buidhnean no orcastra. Bidh sinn cuideachd a’ cur ris an dàta seo le fiosrachadh mu àireamh nan sgaoilidhean a chuir gach neach-ealain a-mach tron ​​bhliadhna. Airson luchd-ealain aonaranach, bidh sinn cuideachd a’ toirt a-steach fiosrachadh mu na buidhnean anns an robh iad nam pàirt gach bliadhna.

SELECT
 
 
 ?artist_name ?year
 
 ?releases_in_year ?releases_up_year
 
 ?artist_type_name ?releases
 
 ?artist_gender ?artist_country_name
 
 ?artist_begin_date ?bands
 
 ?bands_in_year
 
WHERE {
 
 # Bands for each artist
 
 {
 
   SELECT
 
     ?year
 
     ?first_artist
 
     (group_concat(DISTINCT ?second_artist_name;separator=",") as ?bands)
 
     (COUNT(DISTINCT ?second_artist_name) AS ?bands_in_year)     
 
   WHERE {
 
     VALUES ?year {
 
       1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
 
       1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
 
       1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
 
       1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
 
       2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
 
       2010 2011 2012 2013 2014 2015 2016 2017 2018
 
     }   
 
     ?first_artist <http://musicbrainz.foo/name> "Elton John" .
 
     ?first_artist <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist> .
 
     ?first_artist <http://musicbrainz.foo/type> ?first_artist_type .
 
     ?first_artist <http://musicbrainz.foo/name> ?first_artist_name .
 

 
 
     ?second_artist <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist> .
 
     ?second_artist <http://musicbrainz.foo/type> ?second_artist_type .
 
     ?second_artist <http://musicbrainz.foo/name> ?second_artist_name .
 
     optional { ?second_artist <http://musicbrainz.foo/begin-date-year> ?second_artist_begin_date_year . }
 
     optional { ?second_artist <http://musicbrainz.foo/end-date-year> ?second_artist_end_date_year . }
 

 
 
     ?l_artist_artist <http://musicbrainz.foo/entity0> ?first_artist .
 
     ?l_artist_artist <http://musicbrainz.foo/entity1> ?second_artist .
 
     ?l_artist_artist <http://musicbrainz.foo/link> ?link .
 

 
 
     optional { ?link <http://musicbrainz.foo/begin-date-year> ?link_begin_date_year . }
 
     optional { ?link <http://musicbrainz.foo/end-date-year> ?link_end_date_year . }
 

 
 
     FILTER (!bound(?link_begin_date_year) || ?link_begin_date_year <= ?year)
 
     FILTER (!bound(?link_end_date_year) || ?link_end_date_year >= ?year)
 
     FILTER (!bound(?second_artist_begin_date_year) || ?second_artist_begin_date_year <= ?year)
 
     FILTER (!bound(?second_artist_end_date_year) || ?second_artist_end_date_year >= ?year)
 
     FILTER (?first_artist_type NOT IN (<http://musicbrainz.foo/artist-type/2>, <http://musicbrainz.foo/artist-type/5>, <http://musicbrainz.foo/artist-type/6>))
 
     FILTER (?second_artist_type IN (<http://musicbrainz.foo/artist-type/2>, <http://musicbrainz.foo/artist-type/5>, <http://musicbrainz.foo/artist-type/6>))
 
   }
 
   GROUP BY ?first_artist ?year
 
 }
 
 # Releases up to a year
 
 {
 
   SELECT
 
     ?artist
 
     ?year
 
     (group_concat(DISTINCT ?release_name;separator=",") as ?releases)
 
     (COUNT(*) as ?releases_up_year)
 
   WHERE {
 
     VALUES ?year {
 
       1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
 
       1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
 
       1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
 
       1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
 
       2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
 
       2010 2011 2012 2013 2014 2015 2016 2017 2018 
 
     }
 

 
 
     ?artist <http://musicbrainz.foo/name> "Elton John" .
 

 
 
     ?artist_credit_name <http://musicbrainz.foo/artist-credit> ?artist_credit .
 
     ?artist_credit_name <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist-credit-name> .
 
     ?artist_credit_name <http://musicbrainz.foo/artist> ?artist .
 
     ?artist_credit <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist-credit> .
 

 
 
     ?release_group <http://musicbrainz.foo/artist-credit> ?artist_credit .
 
     ?release_group <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/release-group> .
 
     ?release_group <http://musicbrainz.foo/name> ?release_group_name .
 
     ?release <http://musicbrainz.foo/release-group> ?release_group .
 
     ?release <http://musicbrainz.foo/name> ?release_name .
 
     ?release_country <http://musicbrainz.foo/release> ?release .
 
     ?release_country <http://musicbrainz.foo/date-year> ?release_country_year .
 

 
 
     FILTER (?release_country_year <= ?year)
 
   }
 
   GROUP BY ?artist ?year
 
 }
 
 # Releases in a year
 
 {
 
   SELECT ?artist ?year (COUNT(*) as ?releases_in_year)
 
   WHERE {
 
     VALUES ?year {
 
       1960 1961 1962 1963 1964 1965 1966 1967 1968 1969
 
       1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
 
       1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
 
       1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
 
       2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
 
       2010 2011 2012 2013 2014 2015 2016 2017 2018 
 
     }
 

 
 
     ?artist <http://musicbrainz.foo/name> "Elton John" .
 

 
 
     ?artist_credit_name <http://musicbrainz.foo/artist-credit> ?artist_credit .
 
     ?artist_credit_name <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist-credit-name> .
 
     ?artist_credit_name <http://musicbrainz.foo/artist> ?artist .
 
     ?artist_credit <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/artist-credit> .
 

 
 
     ?release_group <http://musicbrainz.foo/artist-credit> ?artist_credit .
 
     ?release_group <http://musicbrainz.foo/rdftype> <http://musicbrainz.foo/release-group> .
 
     ?release_group <http://musicbrainz.foo/name> ?release_group_name .
 
     ?release <http://musicbrainz.foo/release-group> ?release_group .
 
     ?release_country <http://musicbrainz.foo/release> ?release .
 
     ?release_country <http://musicbrainz.foo/date-year> ?release_country_year .
 

 
 
     FILTER (?release_country_year = ?year)
 
   }
 
   GROUP BY ?artist ?year
 
 }
 
 # Master data
 
 {
 
   SELECT DISTINCT ?artist ?artist_name ?artist_gender ?artist_begin_date ?artist_country_name
 
   WHERE {
 
     ?artist <http://musicbrainz.foo/name> ?artist_name .
 
     ?artist <http://musicbrainz.foo/name> "Elton John" .
 
     ?artist <http://musicbrainz.foo/gender> ?artist_gender_id .
 
     ?artist_gender_id <http://musicbrainz.foo/name> ?artist_gender .
 
     ?artist <http://musicbrainz.foo/area> ?birth_area .
 
     ?artist <http://musicbrainz.foo/begin-date-year> ?artist_begin_date.
 
     ?birth_area <http://musicbrainz.foo/name> ?artist_country_name .
 

 
 
     FILTER(datatype(?artist_begin_date) = xsd:int)
 
   }

Air sgàth cho iom-fhillte 's a bha an ceist seo, cha b' urrainn dhuinn ach ceistean puing a dhèanamh airson neach-ealain sònraichte, leithid Elton John, ach chan ann airson a h-uile neach-ealain. Chan eil coltas gu bheil Neptune a' leasachadh an iarrtais seo le bhith a' fàgail a-mach sÏoltachain ann am fo-sheataichean. Mar sin, feumar gach fo-sheata a shÏoladh le làimh a rèir ainm an neach-ealain.

Tha prìsean aig Neptune gach uair agus gach IO. Airson ar deuchainnean, chleachd sinn an eisimpleir Neptune as lugha, a chosgas $0,384/uair. Airson a’ cheist gu h-àrd, a bhios a’ tomhas pròifil airson aon neach-obrach, bidh Amazon a’ cur cosgais oirnn airson deichean de mhìltean de ghnìomhachdan I/O, a’ ciallachadh cosgais de $0.02.

co-dhĂšnadh

An toiseach, bidh Amazon Neptune a’ coileanadh a’ mhòr-chuid de na geallaidhean aige. Mar sheirbheis stiùirichte, ’s e stòr-dàta grafa a th’ ann a tha air leth furasta a stàladh agus a ghabhas a chur an gnìomh gun mòran rèiteachaidh. Seo na còig prìomh phuingean againn:

  • Tha luchdachadh suas mòr-chuid sĂŹmplidh ach slaodach. Faodaidh e a bhith iom-fhillte le teachdaireachdan mearachd nach eil glè fheumail.
  • Tha luchdachadh sĂŹos sruthadh a’ toirt taic do gach rud a bha sinn an dĂšil agus bha iad gu math luath.
  • Tha na ceistean sĂŹmplidh ach chan eil iad eadar-ghnĂŹomhach gu leòr airson ceistean anailis a dhèanamh.
  • Feumar ceistean SPARQL a bharrachadh le lĂ imh
  • Tha e doirbh cĂŹsean Amazon a thomhas leis gu bheil e doirbh meud an dĂ ta a thèid a sganadh le ceist SPARQL a thomhas.

Sin agad e an-drĂ sta. ClĂ raich airson Co-labhairt-lĂŹn an-asgaidh air "Cothromachadh Luchdan".


Source: www.habr.com

Ceannaich aoigheachd earbsach airson làraich le dìon DDoS, frithealaichean VPS VDS 🔥 Ceannaich aoigheachd làrach-lìn earbsach le dìon DDoS, frithealaichean VPS VDS | ProHoster