Modelling Data On The Web - University of...
Transcript of Modelling Data On The Web - University of...
COMP60411ModellingDataOnTheWeb
TimMorris&UliSattler
Week1Introduction,DataModels,Tables,andSQL
TopicOverviewWhatisa(core)datamodel?E.g.,Flat:flatfilesTablebased:relationalTreebased:XMLandabitofJSONGraphbased:RDF
Tradeoffs(esp.representational)betweenthemDiscussingpainpoints&sweetspots,distinguishing
principledonesfromDM-basedonesfromthosecausedbyyourusageofDM
CourseGoals:Knowledge&Understanding
This aimstogiveyouagoodunderstandingofcoreconceptsofdatamodellingsomefamiliaritywithformalisms,APIs,andlanguages
formodellingdataonthewebdesign/representationissuesthatarise
courseunit
CourseGoals:Skills
This aimstogiveyoutheability/skilltocomparedifferentdatamodellingformalisms,designoranalyseadatamanagementsystem,
doesitmakegooduseoftheformalism'sfeatures?doesitfititspurpose?
courseunit
CourseStructureLectures
ActivelearningLab
Makesureyouunderstandthecoursework!Readings
AllreadingsavailableonlineCore:the"Learning"eBookseries
LearningSQLLearningXMLLearningSPARQL
OurExpectationsLectures:
activelistening&participationLabMondaysafternoon:
makesureyouunderstandthecoursework!Labduringweek:
workonyourcourseworkmakeuseofTAs:14:00-15:00
Coursework:submitontime
Read!
AssessmentCoursework(50%,≈200marks)
Eachweek,amixture1. MCQquizzes(≈10marks)2. Shortessays(≈5marks)3. Amodellingassignment(≈10marks)4. Aprogrammingassignment(≈15marks)Precisemarkbreakdownvaries
Exam(50%)TakenonlineVerylike1&2
Materials&BlackboardAllcoursematerialsareavailableonlineonthematerialspageWeuseBlackboardfor
CourseworkOnlineforums
SubscribetoeachforumAskquestionsthereAnswerquestionsthereShareexamples,testcasesthere
Exam
VariantCircumstancesDisability(EqualityAct):
anyconditionwhichhasasignificant,adverseandlong-termeffectonaperson’sabilitytocarryoutnormalday-to-dayactivities.
Exam&Studysupport&moreGreat,helpfulpeople
and process
DisabilityAdvisoryandSupportService
CounsellingserviceSSO MitigatingCircumstances
...feelfreetoaskus:we'rehappytoadvise!
Assistance&HelpEarlyinterventionismoreeffective
Ifyouarehavingchallengesofanysortthesoonertheyareidentifiedandcommunicatedtousthemorelikelywecanfindagoodresolution
ThisisverytrueformitigatingcircumstancesIfsomethingisinterfering,documentit!FillouttheformwhenthingsarehappeningThereisa"toolate"here!
...whenindoubt,askusandSSOforMitCircs
ExpectedConductWeexpectofyou(andourselves)to
befairmindedtreateachotherwell&withrespectavoidacademicmalpracticetakeresponsibilityforcoursedutiesbeengaged,curious,andactive
Ifyouhaveaproblemorissuepleaseraiseitwithusifthatdoesn'thelp,contactyourprogrammedirector
Preliminaries
Weallhavetostartsomewhere
DataManagement(1)Almosteveryprogrammustdosomedatamanagement
Ifonlyconfigfiles!Manyareinformationheavy
andmustdealwiththatinformationovertimeDatabaseManagementSystems(DBMSs)
Separate(orseparable)componentSpecialisedforvariablespurposed
secondarystorage,scaling,complexity,etc.
DataManagement:Lifetime
Somedatais(typically)transientorephemeralPositionofthecursoronthescreen
Somedatais(typically)persistentBankrecords,addresses,healthdata,libraryentriesCursorpositioncanbe!
(Ifyouarerecordingthescreen...)
We'refocusedondatathatleanstowardpersistent
DataManagement:Structure
Somedatais(moreorless)informationallyopaquee.g.,images,video,text,audioitsinformation/contentisn't(easily)available
Youtypicallymustdosomeextractionthisiscalledunstructureddata
Somedataisinformationallytransparentitsinformation/contentisprogrammaticallyexplicitthisiscalled(semi-)structureddata
OutOfScopeThereislotsofDMthat'soutsideourscope1. Performance&Scaling:see2. Concurrency
Thustransactions(YoushouldreaduponACIDity)
3. Tuning,indeedmostphysicallevelstuff4. Cleansing5. Integration
Exceptforatinybit,aroundmerging
COMP62421
Theseconsiderationsdoaffectmodelling!
DataAndTheWebTheWebisacollaborativeinformationstructure
LargelydecentralisedImmenseGrowingrapidlyChangingrapidly
TheWebproducesnewdatachallengesScaleofdataKindofdataShapeofdataUseofdata
Dataon,from,behindtheWebOntheWeb
data.gov,data.gov.uk,...FromtheWeb
LogfilesBehindtheWeb
Data(base)backedWebsitesThefilesystemisakindofdatabase
ContentManagementSystemsWordpress
SitesasDatabaseFrontEndsSeeAmazon
WhatisaDataModel?ThreeKeyAspects1. UnderlyingDataStructure,"CoreDataModel"2. DataIntegrity3. DataManipulation4. (Plusafourth!)DataSharing
MoreimportantontheWeb*
"DataModel"isAmbiguous:1. acompletedatarepresentationandmanipulationapproach(wedothis!)2. justthecoredatamodel3. aparticulardatarepresentationforadomainorapplication,alsocalledthedomainmodel
"Doesyourcalendardatamodelincludeleapyears?"
Generally,youcantellfromcontext,(2)israre.
KindsofDataDatacanlenditselftodifferentshapes
Array-likeTree-likeGraph-likeDocument-like
DatacanhavedifferentvolumesSmallto"big"data
DatacanhavedifferentvelocitiesStatic/offlinetostreaming
DatacanhavedifferentusepatternsManyreaders/fewwritersorthereverseorother!
DataDoesNotGrowonTreesDatamaylenditselftooneshape
e.g.,tree-shapeorgraph-shapebutthisdoesnotmeanthat
wehavetopersistitinthisformweknowexactlyhowtocastitinthisform...considerpain-pointsandsweetspotsothersshareitinthisform
PolyglotPersistence...we are gearing up for a shift to polyglot persistence — where anydecent sized enterprise will have a variety of different data storagetechnologies for different kinds of data. There will still be largeamountsof itmanaged in relational stores,but increasinglywe'llbe firstaskinghowwewanttomanipulatethedataandonlythenfiguringoutwhattechnologyisthebestbetforit.
—MartinFowler
PolyglotPersistence(2)Thispolyglot[e]ffectwillbeapparentevenwithinasingleapplication.Acomplex enterprise application uses different kinds of data, and alreadyusuallyintegratesinformationfromdifferentsources.Increasinglywe'llsee such applications manage their own data using differenttechnologiesdependingonhowthedataisused.—MartinFowler
Poly-Glot/-SystemPersistenceEvenasinglecoredatamodelcanresultin
multiplesystemswithdifferentcharacteristicsmultiple,overlapping,domainmodelsmultiple,overlappingowners,versions,variants
ThisisparticularlytrueinontheWeb!
"FlatFiles"--ASimpleModel
ASampleDomainWestartwithaclassicexample:TheAddressBook
PeopleandinformationaboutthemNamesandcontactinformation
Wecandoafirstcutasadiagram
ForExampleBijan!
Name:BijanParsiaCompany:UniversityofManchesterEmail:[email protected]...
Uli!Name:UliSattlerCompany:UniversityofManchesterEmail:[email protected]
Storing!
SlidesarenotagoodstorageplacefordataWehaveanarraylikestructureso...
Howaboutaspreadsheet!1entity/record/personperrowEachfield/attributeisacolumn
Wehavesoftwarethatworkswellwiththis!
InteractingWithTheData
Tothedemo!
PainpointsAround"name"
SortingisoncolumnsCannotsortbysurname
Filtering:canfilterbynamesbeginningwithZCannotfilterbysurnamesbeginningwithZ
Around"address"Can'tsortorfilterbypostcodeCan'tsortorfilterbycityCan'tsortorfilterbycounty
Problemswithspreadsheetsorourformat?
Format2Thisshouldfixourpainpoints!
Interacting!
Demoencore!
NewPainPointsVariablenumbersofthe"same"attribute
PhonenumberEmailaddressWebpageInsertingcolumnsispainful
LotsofpartialcolumnsSheernumbersucks
Companieshaveaddresses!Morethanone!Andphonenumbers,etc.
Moreproblemswithourformat
NOTANewFormatNotafixtoourformat:
FixingTheFormatAgainWewantaddinga(similar)columntobeeasy!
Easyasaddingarow!MakeanewtablejustforphonenumbersIndexnumberswithpersonrows
Format3Nowthisshouldfixourpainpoints!
StillPainPointsSortingdestroystherelationship
WeusedrownumberstoconnectSortingchangestherownumber!
HardtoseetherecordNolongerasimpleflatfile
CSVformatmakesassumptions
Theseare(mostly)implementationproblems!
AnalyseFormatFailureDidwe
getthedomainwrong(addresses)?fititwrongintoourcoreDM(tables)?pickthewrongcoreDMtomodelitin?
Isourformatunworkable?workablebutrequiresalotofapplicationcode?reasonablewithsomeworkarounds?
Howmuchtechnicaldebtarewepilingup?What'sthecostofswitching?
UnsuitableCoreDataModelIfyouare
always"fighting"thesystemuselotsofapplicationcodetohackthingsliveinanerrorrichenvironmenthaveincreasingamountsofworkaroundsupportinyourdata
Yourcoredatamodelmightnotbeagoodfitforyourdomainandapplication!
TheRestOfTheDBMSEvenifyourcoreDMisn'tagoodfit,youmight
bestuckwiththesystemYoupaidgoodmoneyforthatOracledatabase!
needfeaturesoftheimplementationisthereanXMLdatabasewithtransactions?what'sthesupportcontract?
bestuckwiththemodel(criticallegacyapps)Justbecausethemodelisbrokendoesn'tmeanthatthesystemis
Orisbrokenenoughtojustifyaswitch
FlatFileProgramming
SharingOurDatabasesSpreadsheets?Propriatory-ish(Excel,GoogleDoc,OpenOffice)
Linguafranca:CSVComma(orTab)DelimitedValuesExactlythe(pure)flatfilemodelFormat:textfile
1recordperlineFirstlinecanbespecial(columnnames)Eachcolumnseparatedbya","
Wemayneedtoquotecells(withcommas)
CSVExample
ProgrammaticManipulationIfwestoreourdatabasesasCSV
WecanloadandparsethemintostructuresManipulateourdatafromourprograms
E.g.,usingPythonimport csvwith open("../Adresses/mod2-uk-500.csv") as csvfile: line_count = 0 myreader = csv.reader(csvfile, delimiter=',', quotechar='t') for row in myreader: if line_count == 0: line_count += 1 else: print(f' Candidate {line_count}: Firstname {row[0]} Lastname {row[1]} City {row[4]}') line_count += 1print(f'Processed {line_count -1} Candidates.')
SolvingProblemsThissolvessomeproblems!
Inserting/removingcolumnsa"smallmatterofprogramming"Orwecouldusemultiplearrayswithpointers
Wecansplit/combinefieldsatwillWell,withabitofprogramming
WecancontrolsortingwellenoughUsepointerstoconnect
Lotsofwork!
AgainstBespokeProgrammingThisisallatthewronglevel
Flatfilesandflatfile++areubiquitousWeshouldn'tbecodingcomplexfunctions
Overandoveragain!Evenifwecanprogramourwayaroundproblems
Doesn'teliminatetheproblemsSomesolutions(pointers)effectivelychangethecoremodel:nolongerflatfiles!
TablesAcoreDMwheretable(orrelation)isthecoredatastructure
AtableisasetoftuplesAtupleis
ann-arysequenceasetofkey-valuepairs
FlatfilehadonetableWeallowmany!NamedtablesAkarelations
Relations!(Weusetableandrelationinterchangeably)RelationsarelikeFirstOrderLogic(FOL)predicates
Relationname=PredicatenameNumberofcolumns=Arityofpredicate
Person(bijan,u_o_manchester,...)Predicateistrue(orfalse!)ofitsarguments
Relationis"true"oftupleswhichoccurinitPredicatescanhavedefinitions(intensional!)facts(extensional!)
OrderandIdentityRecords/Rows/Entitiesneedidentity
InExcel,wehadtherowlabeltheorderorpositionofarecordwassignificant
Inourmodel,weneeddistinguishingattributeswepushidentityintothedata:akey
eithera"naturally"uniquesetofattributesoramadeupone:anID
Orderisalwaysapropertyofthedatavaluesimplementation
MultipleTablesActionsonmultipletables:Splittingat
designtime:trytonormalizeyourDBruntime:droppingbits
CombiningTaketwotablesandproduceanewtable
ThekeytorelationaldomainmodellingDecomposeyourprobleminto"base"tablesDerivenewtablesforspecificneeds
ARelationalFormalism
WhatIsAFormalism?Aformalsystem(orformalism):syntax:whatcanwewrite?semantics:whatdoesourwritingmean?withprecise(mathematical)definitionsdesignedtocaptureacoherentsetofoperations("syntax"isloose,e.g.,wemightjusthaveacollectionofoperators)
KeyGoalsOfAFormalism1. tobeclearaboutwhatwemean
Inourspreadsheetis"1"anumber,astring,either,both,somethingelse?
2. toallowthedeterminationofkeypropertiese.g.,complexityofqueryanswering
3. toabstractawayfromparticularimplementionse.g.,allowustodeterminewhenwildlydifferentimplementationsarecorrectthuscaninteroperate
Formalismvs.LanguageFormalismsareoftenabstract
Thiscanbeanadvantage!CanbehardtouseifonlyabstractConcreteinstancestypicallyinvolvecompromise
WefocusonconcretelanguagesFormalismsarethetheoryLanguagesarethepractice
Well,itmaybeallrightinpractice,butitwillneverworkintheory.Intheory,thereisnodifferencebetweentheoryandpractice.But,inpractice,thereis.
OtherQuotesOnTheoryvsPractice
SQL:ALanguageForTablesSchema
CREATE TABLEtable_nameUpdate
INSERT INTOtable_nameDELETE FROMtable_nameUPDATEtable_name...
QuerySELECT ... FROMtable_name
SQLoperations(largely)areclosedovertables
AnInfelicityThereisalotoflingowithslightdifferentmeanings.Conceptsgetdividedup
inslightlydifferentways.
Ourtalk Common LearningSQLp.10
CoreDataModelDataIntegrity DataDefinition SQLschemastatements"CREATE"
DataManipulation Query/UpdateLanguage
SQLDatastatements
ASampleSQLProgramCREATE TABLE People ( name varchar(255), company varchar(255), address varchar(255), phone varchar(255), email varchar(255), home_page varchar(255));
INSERT INTO People VALUES ('Aleshia Tomkiewicz', 'Alan D Rosenburg Cpa Pc', '14 Taylor St, St. Stephens Ward, Kent CT2 7PP', '01835-703597','[email protected]', 'http://www.alandrosenburgcpapc.co.uk');SELECT name FROM People
YoumustDefinebeforeUpdatebeforeQueryI.e.,CREATEbeforeINSERTbeforeSELECT
ModellingWithSQLSQLletsusexpressmodelsatthelogicalto(someofthe)physicallevel
SpecifyingindicesisabitphysicalKnowledgeaboutimplementationmayinformmodellingchoices
SQLhasnomechanismsforconceptuallevel
Format1InSQL
Format1InSQL CREATE TABLE People ( name varchar(255), company varchar(255), address varchar(255), phone varchar(255), email varchar(255), home_page varchar(255));
INSERT INTO People VALUES ('Aleshia Tomkiewicz', 'Alan D Rosenburg Cpa Pc', '14 Taylor St, St. Stephens Ward, Kent CT2 7PP', '01835-703597','[email protected]', 'http://www.alandrosenburgcpapc.co.uk');...
Canwedoallthatwedidinthespreadsheet?
SQLManipulationofFormat1CountrecordsinyourPeopletable:
Searchforitems:
Sortthetable!
SELECT COUNT(*) FROM People
SELECT * FROM PeopleWHERE name like 'Aleshia%'
SELECT * FROM PeopleWHERE name like '%Tomkiewicz'
SELECT * FROM PeopleORDER BY name asc
Format2InSQL
Format2InSQL CREATE TABLE People ( first_name varchar(255), surname varchar(255), company varchar(255), street_address varchar(255), city varchar(255), county varchar(255), post_code varchar(255), phone varchar(255), email varchar(255), home_page varchar(255));
INSERT INTO People VALUES ('Aleshia', 'Tomkiewicz', 'Alan D Rosenburg Cpa Pc', '14 Taylor St', 'St. Stephens Ward', 'Kent', 'CT2 7PP', '01835-703597','[email protected]', 'http://www.alandrosenburgcpapc.co.uk');...
SQLManipulationofFormat2Theoldquerieswork,butwecanimprovethem
Searchforitems:
WecanrecreateFormat1!
SELECT * FROM PeopleWHERE first_name = 'Aleshia'
SELECT * FROM PeopleWHERE surname = 'Tomkiewicz'
SELECT first_name || " " ||surname as name, street_address || ", " ||city ||", "|| county ||" " || post_code as address,phone,email,home_pageFROM People
Format3InSQL
Format3InSQL CREATE TABLE People ( person_id SMALLINT UNSIGNED, first_name varchar(255), surname varchar(255), company varchar(255), street_address varchar(255), city varchar(255), county varchar(255), post_code varchar(255), email varchar(255), home_page varchar(255), CONSTRAINT pk_person PRIMARY KEY (person_id));
CREATE TABLE Phone ( person_id varchar(255), number varchar (255), CONSTRAINT pk_phone_number PRIMARY KEY (number));
INSERT INTO People VALUES ('1','Aleshia', 'Tomkiewicz', 'Alan D Rosenburg Cpa Pc', '14 Taylor St', 'St. Stephens Ward', 'Kent', 'CT2 7PP', '[email protected]', 'http://www.alandrosenburgcpapc.co.uk');INSERT INTO Phone Values ('1', '01835-703597')INSERT INTO Phone Values ('1', '01944-369967')
SQLManipulationofFormat3RecreateFormat1andFormat2:easyFindeveryonewithsamephonenumberCanwehaveunassignedphonenumbers?
Howdidourformatsdo?CoreDM/Datastructure:Tablesseemtowork!SQLandRelationalModel
Wecandoeverything!AllqueriesinallmodelsFormat3has2tables/requiresjoins
Format3Neaterinsertinganddeleting
Canhaveasmanyphonesasyouwant!Everyotherdomainmodelcanbederived
Justwritethequery!
ExpressivePowerSQLisexpressive
ThecoredatamodelisrichComposingandfilteringtablesdoesalot!Operatorsandfunctionshelpful
Withoutconcat(...),there'dbetrouble!Thelanguageispowerful
ReasonablycomposableLotsoffeaturesExtended&extensibleinmanyimplementations
Interopproblems!
QueryingWithSQL
SchemasVs.QueriesCREATEstatements
"create"emptytablesoutofnothingatallwithcertainconstraintswithsomeexpectationofpermanence
SELECTstatements"generate"newtables(possiblywithdata)outofexistingtablesaccordingtosomeconstraintswithnoexpectationofpermanence
ClosedOverTablesSQLis(mostly)closedovertables
MostSQLconstructstake&producetablesClearexception:Functions!
ManipulationismanipulationoftablesNotrows,columns,orcellsdirectlyRows,columns,andcellsare"degeneratetables"...
FilteringKeyoperationSELECT:ignoringsomeparts
Basically"find"CanfilterrowsorcolumnsorbothRequires"testing"functionsonvalues
FilteringColumnsaka"Projection",specifiedinSELECTclause
Keepallcolumns:
Justasinglecolumn:
Multiplecolumns:
Renamecolumns:
SELECT * FROM People
SELECT county FROM People
SELECT name, county FROM People
SELECT street_address AS address FROM People
FilteringrowsSelectingspecifictuplesSpecifiedintheWHEREclauseofyourquery:
Equality:
Range:
Compoundcriteria:
SELECT * FROM People WHERE surname = "Smith"
SELECT * FROM PeopleWHERE heartrate > 95
SELECT * FROM PeopleWHERE heartrate > 95 AND county="Kent"
BuildingTableswithCrossJoinThefundamentaloperationisCartesianproduct
T1xT2forexamplePeoplexPhone
MakesanewrowforeverypairofrowsfromT1&T2What'sthesizeoftheresult?
Notreallyauser-orientedfeature"Incidentally"crossjoinsaredangerous!
BuildingTablesWithInnerJoinAninnerjoinisajoinfilteredoncommoncolumns
Usefulforourphonerecords!
Theaboveisspecialcase,called"natural"joincanbewrittenasfollows:
SELECT * FROM People, PhoneINNER JOIN ON People.person_id = Phone.person_id
SELECT * FROM People NATURAL JOIN Phone
BuildingTableswithOuterJoinAnouterjoinislikeaninnerjoinbutitreturnsalsorowsthatdonothaveamatchintheothertable
leftouterdifferentfromrightouterSELECT * FROM People, PhoneRIGHT OUTER JOIN ON People.person_id = Phone.person_id
willreturnalsopeoplewhohavenophone!
BuildingAndFilteringOncewe'vebuiltatablewecanfilterthingsweneed:
SELECT * FROM People, PhoneRIGHT OUTER JOIN ON People.person_id = Phone.person_idWHERE People.surname = "Smith"
...youknewthatalready!?
TheCostAkeyissuewithjoins
WorstcasefortheircomputationisaCROSSEvenifyoudon'tgeneratetheCROSS
Youmighthavetoconsiderallthepairs(Ifyouaren'tcareful)
GoodoptimisersavoidbothConsideringlotsofmatches(thinkindexes)Generatinglargeintermediatetables
MultiplePhoneColumnsSomepeoplehavenoneoroneOrnoemailorwebpage
NoSurnameEvenifwenormalisedthataway
Somepeopledon'thaveasurname!
Nullnullisadistinguishedvaluewhichcanmean:
"Valuenotyetknown""Notapplicabletothisentity""Valueundefined"checkout
Keyproperty:Unequaltoeverythingnull = nullisnevertrueMatchonnotnull,ratherthannull
LSQL
Strangevalue!
OuterJoinsIfyouhavenonullsinyourbasetables
youcan'tgetthemintablesderivedbyinnerjoinHowever,the2phonecolumntableisderivable
WeusetheouterjoinOuterjoinstakeatableT
foreachrowinTextenditwiththe(projected)columnsfromanothertableIfthere'samatch,addthematchedvalues*else,addnulls
SeeLearningSQL forexamplesChapter10
NullProliferationnullnevermatches
SoiteratedouterjoinsproliferatenullsAsyougetwider,yougetsparser
Ifyouarematchingonasparseattributenullsposechallengeforrelationaltheory
AndsomewhatforpracticeStartsmovingfromthesweetspot
SQLAndTheWebAbrieftour
SQLDrivenWebsitesManywebsitesarebackedbyadatabase
PHPmakesiteasyConsiderWordPressandotherCMSs
LotsofunstructuredcontentStuffinblobsandtextfields
KeypropertiesScalingACID:Atomicity,Consistency,Isolation,Durability
TransactionsConcurrentaccess
Thereisa thatisstillgoodreading,espchps -
keyhistoricaltext11 12
CSV&SQLprogramsontheWeb
Othergovernmentrepositories:data.govdata.gov.uk
Scientificsitesallaboutclinicaltrials!
allaboutproteins!...
UNDatarepository
ClinicalTrials.govUniProt
GoogleQueryVizLanguageASQLlikelanguage
UsedinGoogleDocsSpreadsheetQUERYfunctiontakesqueriesasargument
WebSQLTheWhatWGandW3CtriedtostandardizeWebSQL
This specification introduces a set of APIs to manipulate client-sidedatabasesusingSQL.
Localdatabasebackedwebapps
ForofflineuseJustincreasedcapabilities
function prepareDatabase(ready, error) { return openDatabase('documents', '1.0', 'Offline document storage', 5*1024*1024, function (db) { db.changeVersion('', '1.0', function (t) { t.executeSql('CREATE TABLE docids (id, name)'); }, error); });}
Whatisthisdata?Arecurringissue:whatisinthisshareddocument?
csvtableJSONsnippet...
Whatdoesitmean?Howtoparse?Howtoshare?Sothatit'sgoodtouse?Self-DescribingandMeaningwillbediscussedatlength
ReadingThereisa thatisstillgoodreading,
espchps -keyhistoricaltext
11 12
AnyQuestionsSoFar?
Labs&CourseworkNext,wegototheLabsYoulookinBBatWeek1coursework:
QuizQ1ShortEssaySE1SmallModellingexerciseM1SomequeryingCW1
Read,think,askus!