Οι πρώτες εντυπώσεις από τον Ποσειδώνα του Αμαζονίου

Χαιρετισμός, κάτοικοι του Khabrovsk. Εν όψει της έναρξης του μαθήματος "AWS για προγραμματιστές" Έχουμε ετοιμάσει μια μετάφραση ενδιαφέροντος υλικού.

Οι πρώτες εντυπώσεις από τον Ποσειδώνα του Αμαζονίου

Σε πολλές περιπτώσεις χρήσης που μας αρέσουν bakdataΌπως βλέπουμε στους ιστότοπους των πελατών μας, σχετικές πληροφορίες κρύβονται στις συνδέσεις μεταξύ οντοτήτων, για παράδειγμα κατά την ανάλυση σχέσεων μεταξύ χρηστών, εξαρτήσεων μεταξύ στοιχείων ή συνδέσεων μεταξύ αισθητήρων. Τέτοιες περιπτώσεις χρήσης συνήθως διαμορφώνονται σε ένα γράφημα. Νωρίτερα φέτος, η Amazon κυκλοφόρησε τη νέα της βάση δεδομένων γραφημάτων, Neptune. Σε αυτήν την ανάρτηση θέλουμε να μοιραστούμε τις πρώτες μας ιδέες, καλές πρακτικές και τι μπορεί να βελτιωθεί με την πάροδο του χρόνου.

Γιατί χρειαζόμασταν τον Ποσειδώνα του Αμαζονίου

Οι βάσεις δεδομένων γραφημάτων υπόσχονται να χειρίζονται πολύ συνδεδεμένα σύνολα δεδομένων καλύτερα από τα σχεσιακά τους ισοδύναμα. Σε τέτοια σύνολα δεδομένων, οι σχετικές πληροφορίες αποθηκεύονται συνήθως σε σχέσεις μεταξύ αντικειμένων. Χρησιμοποιήσαμε ένα εκπληκτικό έργο ανοιχτών δεδομένων για να δοκιμάσουμε τον Ποσειδώνα MusicBrainz. Το MusicBrainz συλλέγει κάθε είδους μουσικά μεταδεδομένα που μπορεί κανείς να φανταστεί, όπως πληροφορίες για καλλιτέχνες, τραγούδια, κυκλοφορίες άλμπουμ ή συναυλίες, καθώς και με ποιον συνεργάστηκε ο καλλιτέχνης πίσω από το τραγούδι ή πότε κυκλοφόρησε το άλμπουμ σε ποια χώρα. Το MusicBrainz μπορεί να θεωρηθεί ως ένα τεράστιο δίκτυο οντοτήτων που συνδέονται με κάποιο τρόπο με τη μουσική βιομηχανία.

Το σύνολο δεδομένων MusicBrainz παρέχεται ως ένδειξη CSV μιας σχεσιακής βάσης δεδομένων. Συνολικά, η χωματερή περιέχει περίπου 93 εκατομμύρια σειρές σε 157 πίνακες. Ενώ ορισμένοι από αυτούς τους πίνακες περιέχουν βασικά δεδομένα όπως καλλιτέχνες, συμβάντα, ηχογραφήσεις, κυκλοφορίες ή κομμάτια, άλλα πίνακες συνδέσμων — αποθήκευση σχέσεων μεταξύ καλλιτεχνών και ηχογραφήσεων, άλλων καλλιτεχνών ή κυκλοφοριών, κ.λπ.... Επιδεικνύουν τη δομή γραφήματος ενός συνόλου δεδομένων. Κατά τη μετατροπή του συνόλου δεδομένων σε τριπλάσια RDF, λάβαμε περίπου 500 εκατομμύρια περιπτώσεις.

Με βάση την εμπειρία και τις εντυπώσεις των εταίρων του έργου με τους οποίους συνεργαζόμαστε, παρουσιάζουμε ένα περιβάλλον στο οποίο αυτή η βάση γνώσεων χρησιμοποιείται για τη λήψη νέων πληροφοριών. Επιπλέον, αναμένουμε να ενημερώνεται τακτικά, για παράδειγμα με την προσθήκη νέων εκδόσεων ή την ενημέρωση των μελών της ομάδας.

προσαρμογή

Όπως ήταν αναμενόμενο, η εγκατάσταση του Amazon Neptune είναι απλή. Είναι αρκετά λεπτομερής τεκμηριωμένη. Μπορείτε να ξεκινήσετε μια βάση δεδομένων γραφημάτων με λίγα μόνο κλικ. Ωστόσο, όταν πρόκειται για πιο λεπτομερή διαμόρφωση, απαραίτητες πληροφορίες δύσκολο να βρεθεί. Επομένως, θέλουμε να δείξουμε μια παράμετρο διαμόρφωσης.

Οι πρώτες εντυπώσεις από τον Ποσειδώνα του Αμαζονίου
Στιγμιότυπο οθόνης διαμόρφωσης για ομάδες παραμέτρων

Η Amazon λέει ότι ο Neptune εστιάζει σε φόρτους εργασίας συναλλαγών χαμηλής καθυστέρησης, γι' αυτό και το προεπιλεγμένο χρονικό όριο αιτήματος είναι 120 δευτερόλεπτα. Ωστόσο, έχουμε δοκιμάσει πολλές αναλυτικές περιπτώσεις χρήσης στις οποίες φτάναμε τακτικά σε αυτό το όριο. Αυτό το χρονικό όριο μπορεί να αλλάξει δημιουργώντας μια νέα ομάδα παραμέτρων για τον Neptune και ρυθμίζοντας neptune_query_timeout αντίστοιχο περιορισμό.

Τα δεδομένα φορτώνονται

Παρακάτω θα συζητήσουμε λεπτομερώς πώς φορτώσαμε τα δεδομένα του MusicBrainz στον Neptune.

Σχέσεις στα τρία

Πρώτα, μετατρέψαμε τα δεδομένα του MusicBrainz σε τριπλάσια RDF. Επομένως, για κάθε πίνακα, ορίσαμε ένα πρότυπο που καθορίζει τον τρόπο με τον οποίο αναπαρίσταται κάθε στήλη στον τριπλό. Σε αυτό το παράδειγμα, κάθε γραμμή από τον πίνακα εκτελεστών αντιστοιχίζεται σε δώδεκα τριάδες 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> .

Μαζική μεταφόρτωση

Ο προτεινόμενος τρόπος για να φορτώσετε μεγάλες ποσότητες δεδομένων στο Neptune είναι μέσω της διαδικασίας μαζικής μεταφόρτωσης μέσω S3. Μετά τη μεταφόρτωση των τριπλών αρχείων σας στο S3, ξεκινάτε τη μεταφόρτωση χρησιμοποιώντας ένα αίτημα POST. Στην περίπτωσή μας, χρειάστηκαν περίπου 24 ώρες για 500 εκατομμύρια τρίδυμα. Περιμέναμε να είναι πιο γρήγορο.

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

Για να αποφύγουμε αυτή τη μακρά διαδικασία κάθε φορά που εκκινούμε το Neptune, αποφασίσαμε να επαναφέρουμε το στιγμιότυπο από ένα στιγμιότυπο στο οποίο αυτά τα τρίδυμα ήταν ήδη φορτωμένα. Η εκτέλεση από ένα στιγμιότυπο είναι σημαντικά πιο γρήγορη, αλλά εξακολουθεί να διαρκεί περίπου μία ώρα έως ότου ο Neptune είναι διαθέσιμος για αιτήματα.

Όταν αρχικά φορτώναμε τρίδυμα στον Ποσειδώνα, αντιμετωπίσαμε διάφορα σφάλματα.

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

Ορισμένα από αυτά ήταν σφάλματα ανάλυσης, όπως φαίνεται παραπάνω. Μέχρι σήμερα, ακόμα δεν έχουμε καταλάβει τι ακριβώς πήγε στραβά σε αυτό το σημείο. Λίγη περισσότερη λεπτομέρεια σίγουρα θα βοηθούσε εδώ. Αυτό το σφάλμα παρουσιάστηκε για περίπου το 1% των τριπλών που εισήχθησαν. Αλλά όσον αφορά τη δοκιμή του Neptune, αποδεχτήκαμε το γεγονός ότι εργαζόμαστε μόνο με το 99% των πληροφοριών από το MusicBrainz.

Παρόλο που αυτό είναι εύκολο για άτομα που είναι εξοικειωμένα με το SPARQL, θα πρέπει να γνωρίζετε ότι οι τριάδες RDF πρέπει να σχολιάζονται με ρητούς τύπους δεδομένων, κάτι που και πάλι μπορεί να προκαλέσει σφάλματα.

Λήψη ροής

Όπως αναφέρθηκε παραπάνω, δεν θέλουμε να χρησιμοποιήσουμε το Neptune ως στατικό χώρο αποθήκευσης δεδομένων, αλλά ως μια ευέλικτη και εξελισσόμενη βάση γνώσεων. Χρειαζόμασταν λοιπόν να βρούμε τρόπους να εισάγουμε νέες τριάδες όταν αλλάζει η βάση γνώσεων, για παράδειγμα όταν δημοσιεύεται ένα νέο άλμπουμ ή όταν θέλουμε να υλοποιήσουμε τη γνώση που προκύπτει.

Ο Neptune υποστηρίζει τελεστές εισόδου μέσω ερωτημάτων SPARQL, τόσο ακατέργαστων όσο και βασισμένων σε δείγμα. Θα συζητήσουμε και τις δύο προσεγγίσεις παρακάτω.

Ένας από τους στόχους μας ήταν να εισάγουμε δεδομένα με τρόπο ροής. Σκεφτείτε να κυκλοφορήσετε ένα άλμπουμ σε μια νέα χώρα. Από την πλευρά του MusicBrainz, αυτό σημαίνει ότι για μια κυκλοφορία που περιλαμβάνει άλμπουμ, σινγκλ, EP κ.λπ., προστίθεται μια νέα καταχώρηση στον πίνακα απελευθέρωση-χώρα. Στο RDF, αντιστοιχίζουμε αυτές τις πληροφορίες με δύο νέες τριάδες.

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

Ένας άλλος στόχος ήταν η απόκτηση νέων γνώσεων από το γράφημα. Ας πούμε ότι θέλουμε να πάρουμε τον αριθμό των κυκλοφοριών που έχει δημοσιεύσει κάθε καλλιτέχνης στην καριέρα του. Ένα τέτοιο ερώτημα είναι αρκετά περίπλοκο και διαρκεί πάνω από 20 λεπτά στον Ποσειδώνα, επομένως πρέπει να υλοποιήσουμε το αποτέλεσμα για να χρησιμοποιήσουμε ξανά αυτή τη νέα γνώση σε κάποια άλλη ερώτηση. Έτσι προσθέτουμε τριπλάσια με αυτές τις πληροφορίες πίσω στο γράφημα, εισάγοντας το αποτέλεσμα της υποερώτησης.

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
 
}

Η προσθήκη μεμονωμένων τριπλών στο γράφημα διαρκεί μερικά χιλιοστά του δευτερολέπτου, ενώ ο χρόνος εκτέλεσης για την εισαγωγή του αποτελέσματος ενός υποερωτήματος εξαρτάται από τον χρόνο εκτέλεσης του ίδιου του υποερωτήματος.

Αν και δεν το χρησιμοποιούσαμε συχνά, το Neptune σάς επιτρέπει επίσης να αφαιρέσετε τρίδυμα με βάση δείγματα ή ρητά δεδομένα, τα οποία μπορούν να χρησιμοποιηθούν για την ενημέρωση πληροφοριών.

Ερωτήματα SPARQL

Παρουσιάζοντας το προηγούμενο υποδείγμα, το οποίο επιστρέφει τον αριθμό των κυκλοφοριών για κάθε καλλιτέχνη, έχουμε ήδη εισαγάγει τον πρώτο τύπο ερωτήματος που θέλουμε να απαντήσουμε χρησιμοποιώντας το Neptune. Η δημιουργία ενός ερωτήματος στο Neptune είναι εύκολη - στείλτε ένα αίτημα POST στο τελικό σημείο SPARQL, όπως φαίνεται παρακάτω:

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

Επιπλέον, έχουμε εφαρμόσει ένα ερώτημα που επιστρέφει ένα προφίλ καλλιτέχνη που περιέχει πληροφορίες σχετικά με το όνομα, την ηλικία ή τη χώρα προέλευσής του. Λάβετε υπόψη ότι οι ερμηνευτές μπορεί να είναι άτομα, συγκροτήματα ή ορχήστρες. Επιπλέον, συμπληρώνουμε αυτά τα δεδομένα με πληροφορίες σχετικά με τον αριθμό των κυκλοφοριών που κυκλοφόρησαν από καλλιτέχνες κατά τη διάρκεια του έτους. Για σόλο καλλιτέχνες, προσθέτουμε επίσης πληροφορίες για τα συγκροτήματα στα οποία συμμετείχε ο καλλιτέχνης κάθε χρόνο.

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

Λόγω της πολυπλοκότητας ενός τέτοιου ερωτήματος, θα μπορούσαμε να εκτελέσουμε σημειακά ερωτήματα μόνο για έναν συγκεκριμένο καλλιτέχνη, όπως ο Elton John, αλλά όχι για όλους τους καλλιτέχνες. Ο Neptune δεν φαίνεται να βελτιστοποιεί ένα τέτοιο ερώτημα ρίχνοντας φίλτρα σε υποεπιλογές. Επομένως, κάθε επιλογή πρέπει να φιλτράρεται χειροκίνητα με βάση το όνομα καλλιτέχνη.

Ο Neptune έχει τόσο ωριαίες όσο και ανά I/O χρεώσεις. Για τις δοκιμές μας, χρησιμοποιήσαμε το ελάχιστο παράδειγμα Neptune, το οποίο κοστίζει 0,384 $/ώρα. Στην περίπτωση του παραπάνω ερωτήματος, το οποίο υπολογίζει το προφίλ για έναν μόνο εργαζόμενο, η Amazon μας χρεώνει δεκάδες χιλιάδες λειτουργίες I/O, που συνεπάγεται κόστος 0.02 $.

Παραγωγή

Πρώτον, η Amazon Neptune τηρεί τις περισσότερες από τις υποσχέσεις της. Ως διαχειριζόμενη υπηρεσία, είναι μια βάση δεδομένων γραφημάτων που είναι εξαιρετικά εύκολη στην εγκατάσταση και μπορεί να λειτουργήσει χωρίς πολλές ρυθμίσεις παραμέτρων. Εδώ είναι τα πέντε βασικά ευρήματά μας:

  • Η μαζική μεταφόρτωση είναι εύκολη αλλά αργή. Αλλά μπορεί να γίνει πολύπλοκο με μηνύματα λάθους που δεν είναι πολύ χρήσιμα.
  • Η λήψη με ροή υποστηρίζει όλα όσα περιμέναμε και ήταν αρκετά γρήγορη
  • Τα ερωτήματα είναι απλά, αλλά όχι αρκετά διαδραστικά για την εκτέλεση αναλυτικών ερωτημάτων
  • Τα ερωτήματα SPARQL πρέπει να βελτιστοποιηθούν με μη αυτόματο τρόπο
  • Οι πληρωμές της Amazon είναι δύσκολο να εκτιμηθούν επειδή είναι δύσκολο να εκτιμηθεί ο όγκος των δεδομένων που σαρώθηκαν από ένα ερώτημα SPARQL.

Αυτό είναι όλο. Εγγραφείτε δωρεάν διαδικτυακό σεμινάριο με θέμα «Ισορροπία φορτίου».


Πηγή: www.habr.com

Προσθέστε ένα σχόλιο