Argraffiadau cyntaf o Amazon Neifion

Cyfarchion, trigolion Khabrovsk. Gan ragweld dechrau'r cwrs "AWS ar gyfer Datblygwyr" Rydym wedi paratoi cyfieithiad o ddeunydd diddorol.

Argraffiadau cyntaf o Amazon Neifion

Mewn llawer o achosion defnydd yr ydym yn eu hoffi bakdataFel y gwelwn ar wefannau ein cleientiaid, mae gwybodaeth berthnasol yn cael ei chuddio mewn cysylltiadau rhwng endidau, er enghraifft wrth ddadansoddi perthnasoedd rhwng defnyddwyr, dibyniaethau rhwng elfennau, neu gysylltiadau rhwng synwyryddion. Mae achosion defnydd o'r fath fel arfer yn cael eu modelu ar graff. Yn gynharach eleni, rhyddhaodd Amazon ei gronfa ddata graffiau newydd, Neifion. Yn y swydd hon rydym am rannu ein syniadau cyntaf, arferion da a'r hyn y gellir ei wella dros amser.

Pam roedd angen Amazon Neifion arnom

Mae cronfeydd data graff yn addo trin setiau data cysylltiedig iawn yn well na'u cywerthoedd perthynol. Mewn setiau data o'r fath, mae gwybodaeth berthnasol fel arfer yn cael ei storio mewn perthnasoedd rhwng gwrthrychau. Fe ddefnyddion ni brosiect data agored anhygoel i brofi Neifion MusicBrainz. Mae MusicBrainz yn casglu pob math o fetadata cerddoriaeth y gellir ei ddychmygu, megis gwybodaeth am artistiaid, caneuon, datganiadau albwm neu gyngherddau, yn ogystal â phwy y cydweithiodd yr artist y tu ôl i'r gân neu pryd y rhyddhawyd yr albwm ym mha wlad. Gellir gweld MusicBrainz fel rhwydwaith enfawr o endidau sydd rywsut yn gysylltiedig â'r diwydiant cerddoriaeth.

Darperir set ddata MusicBrainz fel dymp CSV o gronfa ddata berthynol. Yn gyfan gwbl, mae'r domen yn cynnwys tua 93 miliwn o resi mewn 157 o dablau. Er bod rhai o'r tablau hyn yn cynnwys data sylfaenol fel artistiaid, digwyddiadau, recordiadau, datganiadau neu draciau, mae eraill tablau cyswllt — yn storio perthnasoedd rhwng artistiaid a recordiadau, artistiaid eraill neu ddatganiadau, ac ati... Maent yn dangos strwythur graff set ddata. Wrth drosi'r set ddata yn driphlyg RDF, cawsom tua 500 miliwn o achosion.

Yn seiliedig ar brofiad ac argraffiadau partneriaid y prosiect rydym yn gweithio gyda nhw, rydym yn cyflwyno lleoliad lle defnyddir y sylfaen wybodaeth hon i gael gwybodaeth newydd. Yn ogystal, rydym yn disgwyl iddo gael ei ddiweddaru'n rheolaidd, er enghraifft trwy ychwanegu datganiadau newydd neu ddiweddaru aelodau'r grŵp.

addasiad

Yn ôl y disgwyl, mae gosod Amazon Neptune yn syml. Mae hi'n eithaf manwl dogfenedig. Gallwch chi lansio cronfa ddata graff mewn dim ond ychydig o gliciau. Fodd bynnag, o ran cyfluniad manylach, gwybodaeth angenrheidiol anodd dod o hyd. Felly, rydym am dynnu sylw at un paramedr cyfluniad.

Argraffiadau cyntaf o Amazon Neifion
Llun ffurfweddu ar gyfer grwpiau paramedr

Dywed Amazon fod Neifion yn canolbwyntio ar lwythi gwaith trafodaethol hwyrni isel, a dyna pam mai 120 eiliad yw terfyn amser y cais rhagosodedig. Fodd bynnag, rydym wedi profi llawer o achosion defnydd dadansoddol lle gwnaethom gyrraedd y terfyn hwn yn rheolaidd. Gellir newid y terfyn amser hwn trwy greu grŵp paramedr newydd ar gyfer Neifion a gosodiad neptune_query_timeout cyfyngiad cyfatebol.

Llwytho Data

Isod byddwn yn trafod yn fanwl sut y gwnaethom lwytho data MusicBrainz i Neifion.

Perthynas mewn trioedd

Yn gyntaf, fe wnaethom drosi data MusicBrainz yn driphlyg RDF. Felly, ar gyfer pob tabl, fe wnaethom ddiffinio templed sy'n diffinio sut mae pob colofn yn cael ei gynrychioli yn y triphlyg. Yn yr enghraifft hon, mae pob rhes o'r tabl perfformiwr wedi'i mapio i ddeuddeg triphlyg RDF.

<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> .

Swmp-lwytho i fyny

Y ffordd a awgrymir i lwytho llawer iawn o ddata i Neifion yw trwy'r broses swmp-lwytho i fyny trwy S3. Ar ôl uwchlwytho'ch ffeiliau triphlyg i S3, byddwch yn dechrau llwytho i fyny gan ddefnyddio cais POST. Yn ein hachos ni, fe gymerodd tua 24 awr ar gyfer 500 miliwn o dripledi. Roeddem yn disgwyl iddo fod yn gyflymach.

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"
 
}'

Er mwyn osgoi'r broses hir hon bob tro y byddwn yn lansio Neifion, fe wnaethom benderfynu adfer yr enghraifft o giplun lle'r oedd y tripledi hyn eisoes wedi'u llwytho. Mae rhedeg o giplun yn sylweddol gyflymach, ond mae'n dal i gymryd tua awr nes bod Neifion ar gael ar gyfer ceisiadau.

Wrth lwytho tripledi i Neifion i ddechrau, daethom ar draws amryw wallau.

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

Roedd rhai ohonynt yn wallau dosrannu, fel y dangosir uchod. Hyd yn hyn, nid ydym wedi darganfod beth yn union aeth o'i le ar hyn o bryd. Byddai ychydig mwy o fanylion yn bendant yn helpu yma. Digwyddodd y gwall hwn ar gyfer tua 1% o'r triphlyg a fewnosodwyd. Ond cyn belled ag y mae profi Neifion yn mynd, fe wnaethom dderbyn y ffaith mai dim ond gyda 99% o'r wybodaeth gan MusicBrainz yr ydym yn gweithio.

Er bod hyn yn hawdd i bobl sy'n gyfarwydd â SPARQL, byddwch yn ymwybodol bod yn rhaid anodi triphlyg RDF â mathau penodol o ddata, sydd eto'n gallu achosi gwallau.

Ffrydio llwytho i lawr

Fel y soniwyd uchod, nid ydym am ddefnyddio Neifion fel storfa ddata statig, ond yn hytrach fel sylfaen wybodaeth hyblyg ac esblygol. Felly roedd angen i ni ddod o hyd i ffyrdd o gyflwyno triphlyg newydd pan fydd y sylfaen wybodaeth yn newid, er enghraifft pan fydd albwm newydd yn cael ei gyhoeddi neu pan fyddwn am wireddu gwybodaeth ddeilliadol.

Mae Neifion yn cefnogi gweithredwyr mewnbwn trwy ymholiadau SPARQL, yn amrwd ac yn seiliedig ar sampl. Byddwn yn trafod y ddau ddull isod.

Un o'n nodau oedd mewnbynnu data mewn modd ffrydio. Ystyriwch ryddhau albwm mewn gwlad newydd. O safbwynt MusicBrainz, mae hyn yn golygu, ar gyfer datganiad sy'n cynnwys albymau, senglau, EPs, ac ati, bod cofnod newydd yn cael ei ychwanegu at y tabl rhyddhau-wlad. Yn RDF, rydym yn paru'r wybodaeth hon â dau driphlyg newydd.

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> };

Nod arall oedd cael gwybodaeth newydd o'r graff. Gadewch i ni ddweud ein bod am gael y nifer o ddatganiadau y mae pob artist wedi'u cyhoeddi yn eu gyrfa. Mae ymholiad o'r fath yn eithaf cymhleth ac yn cymryd dros 20 munud yn Neifion, felly mae angen inni wireddu'r canlyniad er mwyn ailddefnyddio'r wybodaeth newydd hon mewn rhyw ymholiad arall. Felly rydyn ni'n ychwanegu triphlyg gyda'r wybodaeth hon yn ôl i'r graff, gan nodi canlyniad y subquery.

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
 
}

Mae ychwanegu triphlyg unigol i'r graff yn cymryd ychydig o filieiliadau, tra bod yr amser gweithredu ar gyfer mewnosod canlyniad subquery yn dibynnu ar amser gweithredu'r subquery ei hun.

Er na wnaethom ei ddefnyddio'n aml, mae Neifion hefyd yn caniatáu ichi gael gwared ar dripledi yn seiliedig ar samplau neu ddata penodol, y gellir eu defnyddio i ddiweddaru gwybodaeth.

Ymholiadau SPARQL

Drwy gyflwyno'r is-sampl blaenorol, sy'n dychwelyd nifer y datganiadau ar gyfer pob artist, rydym eisoes wedi cyflwyno'r math cyntaf o ymholiad yr ydym am ei ateb gan ddefnyddio Neifion. Mae adeiladu ymholiad yn Neifion yn hawdd - anfonwch gais POST i bwynt terfyn SPARQL, fel y dangosir isod:

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

Yn ogystal, rydym wedi gweithredu ymholiad sy'n dychwelyd proffil artist sy'n cynnwys gwybodaeth am ei enw, oedran, neu wlad wreiddiol. Cofiwch y gall y perfformwyr fod yn unigolion, yn fandiau neu'n gerddorfeydd. Yn ogystal, rydym yn ategu'r data hwn â gwybodaeth am nifer y datganiadau a ryddhawyd gan artistiaid yn ystod y flwyddyn. Ar gyfer artistiaid unigol, rydym hefyd yn ychwanegu gwybodaeth am y bandiau y cymerodd artistiaid ran ynddynt bob blwyddyn.

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)
 
   }

Oherwydd cymhlethdod ymholiad o’r fath, dim ond ymholiadau pwynt ar gyfer artist penodol, fel Elton John, y gallem eu cyflawni, ond nid ar gyfer pob artist. Nid yw'n ymddangos bod Neifion yn gwneud y gorau o ymholiad o'r fath trwy ollwng hidlwyr i is-ddewisiadau. Felly, rhaid hidlo pob dewis â llaw yn ôl enw artist.

Mae gan Neifion daliadau fesul awr a fesul I/O. Ar gyfer ein profion, gwnaethom ddefnyddio'r enghraifft leiaf noeth o Neifion, sy'n costio $0,384 yr awr. Yn achos yr ymholiad uchod, sy'n cyfrifo'r proffil ar gyfer gweithiwr sengl, mae Amazon yn codi degau o filoedd o weithrediadau I/O arnom, sy'n awgrymu cost o $0.02.

Allbwn

Yn gyntaf, mae Amazon Neptune yn cadw'r rhan fwyaf o'i addewidion. Fel gwasanaeth a reolir, mae'n gronfa ddata graff sy'n hynod o hawdd i'w gosod a gall fod ar waith heb lawer o gyfluniad. Dyma ein pum canfyddiad allweddol:

  • Mae swmp-lwytho yn hawdd ond yn araf. Ond gall fod yn gymhleth gyda negeseuon gwall nad ydynt yn ddefnyddiol iawn.
  • Mae ffrydio lawrlwytho yn cefnogi popeth yr oeddem yn ei ddisgwyl ac roedd yn eithaf cyflym
  • Mae ymholiadau'n syml, ond nid ydynt yn ddigon rhyngweithiol i redeg ymholiadau dadansoddol
  • Rhaid optimeiddio ymholiadau SPARQL â llaw
  • Mae taliadau Amazon yn anodd eu hamcangyfrif oherwydd ei bod yn anodd amcangyfrif faint o ddata a sganiwyd gan ymholiad SPARQL.

Dyna i gyd. Cofrestrwch ar gyfer gweminar am ddim ar y testun “Cydbwyso Llwyth”.


Ffynhonnell: hab.com

Ychwanegu sylw