Salute, mga residente sa Khabrovsk. Sa pagpaabot sa pagsugod sa kurso
Sa daghang mga kaso sa paggamit nga gusto namon
Ngano nga kinahanglan namon ang Amazon Neptune
Ang mga database sa graph nagsaad nga madumala ang labi ka konektado nga mga set sa datos nga labi ka maayo kaysa sa ilang mga katumbas nga relasyon. Sa ingon nga mga dataset, ang may kalabutan nga impormasyon kasagarang gitipigan sa mga relasyon tali sa mga butang. Gigamit namo ang usa ka talagsaon nga open data project aron sulayan ang Neptune
Ang MusicBrainz dataset gihatag isip CSV dump sa usa ka relational database. Sa kinatibuk-an, ang dump adunay mga 93 milyon nga mga laray sa 157 nga mga lamesa. Samtang ang pipila niini nga mga lamesa adunay sukaranan nga datos sama sa mga artista, panghitabo, pagrekord, pagpagawas o mga track, uban pa link nga mga lamesa — tindahan sa mga relasyon tali sa mga artista ug mga rekording, uban pang mga artista o mga gipagawas, ug uban pa... Gipakita nila ang istruktura sa graph sa usa ka set sa datos. Kung gi-convert ang dataset ngadto sa RDF triples, nakuha namo ang gibana-bana nga 500 ka milyon nga mga higayon.
Base sa kasinatian ug mga impresyon sa mga kauban sa proyekto nga among gitrabahoan, among gipresentar ang usa ka kahimtang diin kini nga base sa kahibalo gigamit aron makakuha og bag-ong impormasyon. Dugang pa, gilauman namon nga kini kanunay nga ma-update, pananglitan pinaagi sa pagdugang mga bag-ong pagpagawas o pag-update sa mga miyembro sa grupo.
kausaban
Sama sa gipaabut, ang pag-install sa Amazon Neptune yano ra. Detalyado kaayo siya
Pag-configure sa screenshot alang sa mga grupo sa parameter
Giingon sa Amazon nga ang Neptune naka-focus sa mga low-latency nga transactional workloads, mao nga ang default nga oras sa paghangyo mao ang 120 segundos. Kami, bisan pa, nagsulay sa daghang mga kaso sa paggamit sa analitikal diin kanunay namon nga naabot kini nga limitasyon. Kini nga timeout mahimong mausab pinaagi sa paghimo og bag-ong grupo sa parameter para sa Neptune ug setting neptune_query_timeout
katugbang nga pagdili.
Nagkarga sa Data
Sa ubos atong hisgotan sa detalye kon sa unsang paagi atong gikarga ang MusicBrainz data ngadto sa Neptune.
Mga relasyon sa tulo
Una, among gi-convert ang MusicBrainz data ngadto sa RDF triples. Busa, alang sa matag lamesa, among gihubit ang usa ka template nga naghubit kung giunsa ang matag kolum girepresentar sa triple. Niini nga pananglitan, ang matag laray gikan sa lamesa sa performer gimapa ngadto sa dose ka triple sa 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> .
Daghang pag-upload
Ang gisugyot nga paagi sa pag-load sa daghang mga datos sa Neptune mao ang pinaagi sa daghang proseso sa pag-upload pinaagi sa S3. Human ma-upload ang imong triples files sa S3, sugdan nimo ang pag-upload gamit ang POST request. Sa among kaso, niabot ug mga 24 ka oras para sa 500 ka milyon nga triplets. Gipaabot namo nga mas paspas kini.
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"
}'
Aron malikayan kining taas nga proseso sa matag higayon nga maglansad kami sa Neptune, nakahukom kami nga ibalik ang instance gikan sa usa ka snapshot diin kini nga mga triplet nakarga na. Ang pagdagan gikan sa usa ka snapshot labi ka paspas, apan molungtad gihapon mga usa ka oras hangtod magamit ang Neptune alang sa mga hangyo.
Sa una nga pagkarga sa mga triplets ngadto sa Neptune, nasugatan namo ang lainlaing mga sayop.
{
"errorCode" : "PARSING_ERROR",
"errorMessage" : "Content after '.' is not allowed",
"fileName" : [...],
"recordNum" : 25
}
Ang uban niini mga sayop sa pag-parse, sama sa gipakita sa ibabaw. Hangtod karon, wala pa namo mahibaw-i kung unsa gyud ang nahitabo niining puntoha. Ang gamay nga dugang nga detalye siguradong makatabang dinhi. Kini nga sayup nahitabo sa gibana-bana nga 1% sa gisulud nga triple. Apan kutob sa pagsulay sa Neptune, among gidawat ang kamatuoran nga kami nagtrabaho lamang sa 99% sa impormasyon gikan sa MusicBrainz.
Bisan kung kini dali alang sa mga tawo nga pamilyar sa SPARQL, hinumdomi nga ang mga triple sa RDF kinahanglan nga adunay annotate nga mga klaro nga tipo sa datos, nga mahimo usab nga hinungdan sa mga sayup.
Pag-download sa streaming
Sama sa gihisgutan sa ibabaw, dili namo gusto nga gamiton ang Neptune isip usa ka static nga data store, apan isip usa ka flexible ug nag-uswag nga base sa kahibalo. Busa kinahanglan namong mangitag mga paagi sa pagpaila sa bag-ong mga triple sa dihang mausab ang base sa kahibalo, pananglitan sa dihang mamantala ang usa ka bag-ong album o kon gusto namong matuman ang nakuha nga kahibalo.
Gisuportahan sa Neptune ang mga operator sa input pinaagi sa mga pangutana sa SPARQL, pareho nga hilaw ug base sa sample. Atong hisgotan ang duha ka pamaagi sa ubos.
Usa sa among mga katuyoan mao ang pagsulod sa datos sa usa ka streaming nga paagi. Ikonsiderar ang pagpagawas sa usa ka album sa usa ka bag-ong nasud. Gikan sa panan-aw sa MusicBrainz, kini nagpasabot nga alang sa usa ka pagpagawas nga naglakip sa mga album, singles, EPs, ug uban pa, usa ka bag-ong entry ang idugang sa lamesa release-nasud. Sa RDF, gipares namo kini nga impormasyon sa duha ka bag-ong triple.
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> };
Ang laing tumong mao ang pagkuha og bag-ong kahibalo gikan sa graph. Ingnon ta nga gusto namon makuha ang gidaghanon sa mga pagpagawas nga gipatik sa matag artista sa ilang karera. Ang ingon nga pangutana medyo komplikado ug molungtad og kapin sa 20 ka minuto sa Neptune, mao nga kinahanglan natong i-materialize ang resulta aron magamit pag-usab kining bag-ong kahibalo sa ubang pangutana. Mao nga gidugang namon ang mga triple sa kini nga kasayuran balik sa graph, nga gisulod ang resulta sa 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
}
Ang pagdugang og usa ka triple sa graph nagkinahanglan og pipila ka millisecond, samtang ang oras sa pagpatuman sa pagsal-ot sa resulta sa usa ka subquery nagdepende sa oras sa pagpatuman sa subquery mismo.
Bisan kung dili namon kini kanunay nga gigamit, gitugotan ka usab sa Neptune nga tangtangon ang mga triplet base sa mga sample o klaro nga datos, nga magamit sa pag-update sa kasayuran.
Mga pangutana sa SPARQL
Pinaagi sa pagpaila sa miaging subsample, nga nagbalik sa gidaghanon sa mga gipagawas alang sa matag artist, gipaila na namo ang unang matang sa pangutana nga gusto namong tubagon gamit ang Neptune. Ang paghimo og pangutana sa Neptune sayon - magpadala ug POST nga hangyo sa SPARQL endpoint, sama sa gipakita sa ubos:
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
Dugang pa, nagpatuman kami usa ka pangutana nga nagbalik sa usa ka profile sa artista nga adunay kasayuran bahin sa ilang ngalan, edad, o nasud nga gigikanan. Hinumdomi nga ang mga tigpasundayag mahimong mga indibidwal, banda, o orkestra. Dugang pa, gidugangan namon kini nga datos sa kasayuran bahin sa gidaghanon sa mga gipagawas nga gipagawas sa mga artista sa tuig. Para sa mga solo artist, nagdugang usab kami og impormasyon bahin sa mga banda nga giapilan sa artist matag tuig.
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)
}
Tungod sa kakomplikado sa ingon nga pangutana, mahimo ra namon nga himuon ang mga pangutana sa punto alang sa usa ka piho nga artista, sama ni Elton John, apan dili alang sa tanan nga mga artista. Ang Neptune ingon og dili ma-optimize ang ingon nga pangutana pinaagi sa paghulog sa mga filter sa mga subselect. Busa, ang matag pagpili kinahanglan nga mano-mano nga masala sa ngalan sa artist.
Ang Neptune adunay duha ka oras ug kada-I/O nga mga bayronon. Alang sa among pagsulay, gigamit namon ang labing gamay nga pananglitan sa Neptune, nga nagkantidad og $0,384/oras. Sa kaso sa pangutana sa ibabaw, nga nagkalkula sa profile alang sa usa ka trabahante, ang Amazon nagsingil kanamo napulo ka libo nga mga operasyon sa I/O, nga nagpasabut nga kantidad nga $0.02.
konklusyon
Una, gituman sa Amazon Neptune ang kadaghanan sa mga saad niini. Ingon usa ka gidumala nga serbisyo, kini usa ka database sa graph nga labi ka dali nga i-install ug mahimo’g mag-andar nga wala’y daghang pag-configure. Ania ang among lima ka hinungdanon nga nahibal-an:
- Ang daghan nga pag-upload sayon apan hinay. Apan mahimo kini nga komplikado sa mga mensahe sa sayup nga dili kaayo makatabang.
- Ang pag-download sa streaming nagsuporta sa tanan nga among gipaabut ug paspas kaayo
- Ang mga pangutana yano ra, apan dili igo nga interactive aron makadagan ang analytical nga mga pangutana
- Ang mga pangutana sa SPARQL kinahanglang manu-mano nga ma-optimize
- Ang pagbayad sa Amazon lisod banabanaon tungod kay lisod ang pagbanabana sa gidaghanon sa datos nga na-scan sa usa ka pangutana sa SPARQL.
Mao ra. Sign up para sa
Source: www.habr.com