Upload
jerven-bolleman
View
1.143
Download
3
Embed Size (px)
Citation preview
RDF what and why
Jerven Bolleman Developer Swiss-Prot Group
Introduction
• RDF
• Its a technology
• Cost and affordability are key concerns
-.---------.>+++++++[<---------->-]<+.>+++++++[<++++++++++>-]<--.+++++++++++.++++++++.---------.>++++++++[<---------->-]<++.>+++++[<+++++++++++++>-]<.+++++++++++++.----------.>+++++++[<---------->-]<++.>++++++++[<++++++++++>-]<.>+++[<----->-]<.>+++[<++++++>-]<..>+++++++++[<--------->-]<--.>+++++++[<++++++++++>-]<+++.+++++++++++.>++++++++[<----------->-]<++++.>+++++[<+++++++++++++>-]<.>+++[<++++++>-]<-.---.++++++.-------.----------.>++++++++[<----------->-]<+.---.[-]<<<->[-]>[-]<<[>+>+<<-]>>[<<+>>-]>>>[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]>[<+>-]>[<<++++++++++>>>+<-]<<-<-]+++++++++>[<->-]>>+>[<[-]<<+>>>-]>[-]+<<[>+>-<<-]<<<[>>+>+<<<-]>>>[<<<+>>>-]<>>[<+>-]<<-[>[-]<[-]]>>+<[>[-]<-]<++++++++[<++++++<++++++>>-]>>>[>+>+<<-]>>[<<+>>-]<[<<<<<.>>>>>-]<<<<<<.>>[-]>[-]++++[<++++++++>-]<.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<.><+++++..--------.-------.>>[>>+>+<<<-]>>>[<<<+>>>-]<[<<<<++++++++++++++.>>>>-]<<<<[-]>++++[<++++++++>-]<.>+++++++++[<+++++++++>-]<--.---------.>+++++++[<---------->-]<.>++++++[<+++++++++++>-]<.+++..+++++++++++++.>++++++++[<---------->-]<--.>+++++++++[<+++++++++>-]<--.-.>++++++++[<---------->-]<++.>++++++++[<++++++++++>-]<++++.------------.---.>+++++++[<---------->-]<+.>++++++++[<+++++++++++>-]<-.>++[<----------->-]<.+++++++++++..>+++++++++[<---------->-]<-----.---.+++.---.[-]<<<]@
What is RDF?
What?
Why?
SPARQL?
Example
s Examples
RDF: Resource Description Framework
• Resource – Generalization of “Web resource” – A thing that can be identified (but not necessarily
retrieved) on the Web • Description
– A resource is described with statements that specify the properties and property values of the resource
• Statement (aka Triple) – subject: identifies the resource – predicate: identifies a property of the resource – object: identifies the value of that property
Everything can be described with (loads of) triples...
SubjectProperty
(resource)
A Triple
Object (resource
or literal value)
Subject (resource)
Related triples form a graph...
An RDF graph can be serialized in several ways
• RDF/XML: the W3C’s official format – XML is well established: good for application developers – very verbose, not very “readable” – e.g. uniprot.org/uniprot/P00750.rdf
• N-Triple – good for loading into triple stores – e.g. uniprot.org/uniprot/P00750.nt
• Turtle ⟵ most examples will use this – good for reading by humans – e.g. uniprot.org/uniprot/P00750.ttl
• JSON-LD – easy for javascript/websites
• .... • Conversion 100% lossless
A simple example
RDF What and why
presented by
A Triple
“Jerven Bolleman”Literal value
RDF identifies resources with URIs
UniProt.rdf What and why
presented by
A Triple
expasy.org/people/Jerven_Tjalling .Bolleman.htm
URI
Multiple URIs may identify the same thing
expasy.org/people/Jerven_Tjalling .Bolleman.htm
ch.linkedin.com/in/jervenbolleman
owl:sameAs
A Triple
The life sciences have an identity problem...
• www.genenames.org/data/hgnc_data.php?hgnc_id=9993 – RGS11: regulator of G-protein signaling 11
• http://www.uniprot.org/taxonomy/9993 – European alpine marmot
• ...
TextTe What is “9993”?
Hello, I a 9993. I like flower?
The solution are URIs
• In RDF statements: – subject and predicates must be URIs – objects may be URIs or literal values
• Advantages: – No risk of “name clashes” when integrating data from
different sources – Different people can make statements about the same
resource:Distributed annotation at a global scale!
Example: From tab-delimited to semantic
RDF in Turtle format
Tab delimited Converted To
An example
Example: From tab-delimited to semantic
A TripleQ9VGZ4P25724Q9V3H7Q00403P23312P31928Q9NAE1Q9TYY1Q10666Q21921
Interactions.txtP32234P32234P32234P42643P42643P42643P41932P41932P41932P41932
Example step 1: Use URIs for subjects and objects
A TripleInteractions.txt
...prot/Q9VGZ4
...prot/P25724
...prot/Q9V3H7
...prot/Q00403
...prot/P23312
...prot/P31928
...prot/Q9NAE1
...prot/Q9TYY1
...prot/Q10666
...prot/Q21921
purl.uniprot.org/uniprot/P32234purl.uniprot.org/uniprot/P32234purl.uniprot.org/uniprot/P32234...prot/P42643...prot/P42643...prot/P42643...prot/P41932...prot/P41932...prot/P41932...prot/P41932
Example step 2: Use shorthand syntax
A TripleInteractions.txt
prot:Q9VGZ4 .prot:P25724 .prot:Q9V3H7 .prot:Q00403 . prot:P23312 .prot:P31928 .prot:Q9NAE1 .prot:Q9TYY1 . prot:Q10666 . prot:Q21921 .
@prefix prot:<purl.uniprot.org/uniprot/>prot:P32234prot:P32234prot:P32234prot:P42643prot:P42643prot:P42643prot:P41932prot:P41932prot:P41932prot:P41932
Example step 3: Make statements
A TripleInteractions.txt
@prefix prot:<purl.uniprot.org/uniprot/>prot:P32234prot:P32234prot:P32234prot:P42643prot:P42643prot:P42643prot:P41932prot:P41932prot:P41932prot:P41932
interacts_withinteracts_withinteracts_withinteracts_withinteracts_withinteracts_withinteracts_withinteracts_withinteracts_withinteracts_with
prot:Q9VGZ4 .prot:P25724 .prot:Q9V3H7 .prot:Q00403 .prot:P23312 .prot:P31928 .prot:Q9NAE1 .prot:Q9TYY1 .prot:Q10666 .prot:Q21921 .
Example step 4: Use URIs for properties
@prefix prot:<purl.uniprot.org/uniprot/>@prefix core:<purl.uniprot.org/core/>prot:P32234prot:P32234prot:P32234prot:P42643prot:P42643prot:P42643prot:P41932prot:P41932prot:P41932
core:interacts_withcore:interacts_withcore:interacts_withcore:interacts_withcore:interacts_withcore:interacts_withcore:interacts_withcore:interacts_withcore:interacts_with
Interactions.ttl
prot:Q9VGZ4 .prot:P25724 .prot:Q9V3H7 .prot:Q00403 .prot:P23312 .prot:P31928 .prot:Q9NAE1 . prot:Q9TYY1 .prot:Q10666 .
RDF What? Quick recap
• RDF describes data with statements (aka triples) – statement = subject + predicate + object – related statements form a directed graph
• RDF uses URIs to identify things: – subject and predicates must be URIs – objects may be URIs or literal values • Multiple serialisation formats that are 99.999999%
automatically convertible
Why RDF? Isn’t there a simpler solution?
What?
Why?
SPARQL?
Example
s Examples
A very simple example: FASTA
• Why does everyone in the sequence world use FASTA?
A very simple example: FASTA
• Why does everyone in the sequence world use FASTA? – The smallest common denominator – You can put in the header what you like and I can
choose to ignore it
• BUT: You only get a sequence...
>Who|cares_about:this?THISISWHATWEWANT
A simple example: GFF
• Some people want to exchange more than sequences, and invented GFF:
• BUT: ...
SEQ1 EMBL atg 103 105 . + 0 SEQ1 EMBL exon 103 172 . + 0
A simple example: GFF
• Some people want to exchange more than sequences, and invented GFF:
• BUT: What do the columns mean? – Originally, an exchange format for sequence
feature descriptions, later also used for other annotations
– 3 versions known (to me ;) – Not extendable without prior agreement of all
users
SEQ1 EMBL atg 103 105 . + 0 SEQ1 EMBL exon 103 172 . + 0
A proper solution: XML
• There is a world beyond sequences and bioinformatics!
• XML is an IT-industry standard – Datatypes – Multi namespaces – Schemas
• BUT: – Hierarchical data model – Schemas close extension
XML represents data as a tree
• XML datatypes – Multi namespace – XML Schema closes extensions
• Tree format
entry
Protonacceptor 196
active
2.7.11.-
EC
No XML standard for other relationships prizes:a case study
• XML datatypes – Multi namespace – XML Schema closes extensions
• Tree format
entry
Protonacceptor 196
active
2.7.11.-
EC
Our data is a graph!
entry
Protonacceptor
196active
2.7.11.-
EC
RDF advantages
• W3C standard • Can be serialized as XML or JSON
• i.e. most benefits of XML or JSON • Generic graph structure • URIs as a standard way to identify resources and
their properties – data integration without name clashes – distributed annotation – normalization
• Extensible!
RDF is extensible
• Anyone can say Anything about Anything – You can say something about my data
• RDF extensions remain compatible • RDF encourages data and schema reuse
@prefix prot:<purl.uniprot.org/uniprot/>@prefix intact:<fake.ebi.ac.uk/intact/example>prot:P32234prot:P32234
intact:interacts_withintact:interacts_with
Interactions.ttl
prot:Q9VGZ4prot:P25724
RDF data model is simple
• Everything can be said with triples
• Generic triple stores – low maintenance data integration
• SPARQL – SQL – XPath – Regular expressions
for RDF for RDF for RDF
Comparison
Flat file XML RDF
Standard NO YES YES
Scalable NO YES YES +
Extendable NO NO YES
GenericData model NO NO YES
Modeling data using RDF
Most common failure in RDF world: Philosophy over pragmatism
1. Be honest about your data • what you have: not what you want
2. Change the concept change the IRI • One concept can be referred to by multiple IRI
3. Better to “todo” than to “debate”
Model real data not the the “real world”
• Describe records that relate to real world things
• Acknowledge that they are records
• Model measurements before “facts”
Example: mouse in a lab
1.5g
<weight>
Example: mouse in a lab
1.5g
<weight>
20g
<weight>
TIME it made you a liar
Example: mouse in a lab
1.5g
<measurement>
20g
<measurem
ent>
<weight>
<weight>
1week
3week
_:1
_:2 <age>
<age>
Describing models using OWL
OWL: Web Ontology Language
• Will be presented in detail during the week
• Logical meaning added to RDF statements
• That tools use
• Classifies existing data or infers new data
• Very powerful and useful
‹#›
DANGER
It is pure Logic (first order)
45
Classification by restricting set membership
<human> a owl:Class ; rdfs:subClassOf [ owl:onProperty <legs> . owl:cardinality 2 ] ; rdfs:subClassOf [ owl:onProperty <brains> . owl:cardinality 1 ] ; rdfs:subClassOf [ owl:onProperty <referenceGenome> . owl:allValuesFrom <HGCHR_genome> ] ;…
Classification by restricting set membership
<human> a owl:Class ; rdfs:subClassOf [ owl:onProperty <legs> . owl:cardinality 2 ] ; rdfs:subClassOf [ owl:onProperty <brains> . owl:cardinality 1 ] ; rdfs:subClassOf [ owl:onProperty <referenceGenome> . owl:allValuesFrom <HGCHR_genome> ] ;…
Lose a leg → no longer human
Validating RDF Data
W3C workgroup in progress
• Data-‐Shapes
• You don’t want to know how the sausage is made…
• Vendors looking forward to implementing it
• Currently not that bad, could be better
• First Working Draft
SPARQL
What?
Why?
SPARQL?
Example
s Examples
Why provide a public SPARQL endpoint
• A 10 man wet laboratory can not afford:
– to host their own database in house holding all or even a bit of all life science data.
– not to have access, and use, existing life science information.
← Not CPU Time...But Brain Time
↓
The right kind of optimisation
Why provide a public SPARQL endpoint
• Classical SQL can be provided on the web
–Is not practical –No federation –Poor standards conformance
• Local SQL is expensive • Local JSON is no better
• Nor is local XML
Data Integration Traditional
Pathway.txt
UniProt.txt
Pathway Parser
UniProt Parser
Pathway Schema
UniProt Schema
Own Lab Data
Data warehouse
SQL queries
$
$
$
$
$
$
Data Integration RDF/SPARQL
Pathway.rdf
UniProt.rdf
Own Lab Data
Triple Store SPARQL Queries
$
$?
Why provide a public SPARQL endpoint
• Document centric REST is not enough
–Swiss-‐Prot available as REST –(over e-mail !!) since 1986
–expasy.ch since 1993 –www.uniprot.org since 2002
• Most user use a GUI not a CLI • developers build GUI on a CLI
57© 2015 SIB
58© 2015 SIB
100
10'000
1'000'000
2015-01
2015-02
2015-03
2015-04
2015-05
2015-06
2015-07
2015-08
queries ask selectconstruct describe
Queries per month in 2015 peak: 4 million per month
Real users
Mix between hard analytics and super specific
Estimate somewhere between: 300 - 1000 real humans per month
We know they are real because they take holidays ;)
Using the Semantic Web for faster (Bio-) Research
Why learn SPARQL
• Standardised formal query language – implementation independent
• SPARQL ➔ SQL (via R2RML) • SPARQL ➔ webservice (via SADI) • SPARQL ➔ LDAP (e.g. SquirrelRDF) • SPARQL ➔ RDF (triplestore e.g. OWLIM-se) • SPARQL ➔ HADOOP/HIVE (e.g. SHARD) • SPARQL ➔ Linked Data Fragments
– How you query independent of how you store!
Apparently it helps kill vampires !!!
Its SPARQLy mammal time !!
Lets look at an single taxon record www.uniprot.org/taxonomy/9993
Lets look at an single taxon record www.uniprot.org/taxonomy/9993
@base <http://purl.uniprot.org/taxonomy/> . @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix skos: <http://www.w3.org/2004/02/skos/core#> . @prefix up: <http://purl.uniprot.org/core/> . <9993> rdf:type up:Taxon ; up:rank up:Species ; up:reviewed true ; up:mnemonic "MARMR" ; up:scientificName "Marmota marmota" ; up:commonName "Alpine marmot" ; up:otherName "European marmot" ; rdfs:seeAlso <http://animaldiversity.ummz.umich.edu/site/accounts/information/Marmota_marmota.html> , <http://www.alphagalileo.org/Organisations/ViewItem.aspx?OrganisationId=2043&ItemId=70106&CultureCode=en> , <http://www.arkive.org/alpine-marmot/marmota-marmota/info.html> , <http://www.biolib.cz/en/taxon/id20598/> ,
Turtle is the RDF serialization aligned with SPARQL• Shorthand to avoid typing so much
– . ‘dot’ is end statement
– ; ‘semi-‐colon’ repeat subject
– , ‘comma’ is repeat subject and predicate
• prefix
– before ‘:’ is abbreviation of uri
Why don’t these queries work elsewhere?
• PREFIX
– On the web you often have to add these
– But some can be preconfigured
PREFIX :<http://purl.uniprot.org/core/> SELECT ?x FROM <http://purl.uniprot.org/taxonomy/> WHERE {?x a :Taxon}
a = rdf:type = <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
<9993> rdf:type up:Taxon ; up:rank up:Species ; up:reviewed true ; up:mnemonic "MARMR" ; up:scientificName "Marmota marmota" ; up:commonName "Alpine marmot" ; up:otherName "European marmot" ; rdfs:subClassOf <9992> ; skos:narrowerTransitive <9994> ;
rdfs:subClassOf taxon:9994 is a more specific classification than
<9993> rdf:type up:Taxon ; up:rank up:Species ; up:reviewed true ; up:mnemonic "MARMR" ; up:scientificName "Marmota marmota" ; up:commonName "Alpine marmot" ; up:otherName "European marmot" ; rdfs:subClassOf <9992> ; skos:narrowerTransitive <9994> ;
rank => “The level, for nomenclatural purposes, of a taxon in a taxonomic hierarchy”
Lets learn SPARQL
• Queries over RDF data.
– Four basic types
• SELECT
– Returns “tab delimited” results
• CONSTRUCT
– Makes new triples
• DESCRIBE
– Returns all triples mentioning a resource
SPARQL:queries triple pattern
?anyTaxon rdf:type core:Taxon .
SELECT ?anyTaxon WHERE {
}
SPARQL:queries triple pattern
taxon:9606 rdf:type core:Taxon . taxon:9606 core:reviewed “true” .
SPARQL:queries triple pattern
?anyTaxon rdf:type core:Taxon . ?anyTaxon core:reviewed “true” .
SPARQL:queries triple pattern
?anyTaxon rdf:type core:Taxon . ?anyTaxon core:reviewed “true” .
SELECT ?anyTaxon WHERE {
}
SPARQL:queries triple pattern
?anyTaxon rdf:type core:Taxon . ?anyTaxin core:reviewed “true” .
SELECT ?anyTaxon WHERE {
}
SPARQL:queries triple pattern
?anyTaxon rdf:type core:Taxon . $anyTaxon core:reviewed “true” .
SELECT ?anyTaxon WHERE {
}
tutorial.sparql.uniprot.org
1: Select all taxon from NCBI/UniProt taxonomy
• Taxonomy at www|sparql.uniprot.org
• Matches NCBI
• Time sync
• Adds more names
• Ands images
‹#›
88
Lets learn SPARQLShorthand a = rdf:type
2: AND join (default)
3: Shortcuts
Remember ‘;’ shortcut
4: Two variables one output column
5: Optional
• When values may be missing
– yet interesting when they are there
• Use as sub query
• bound values from outside stay bound inside
– ?x ?y?z . OPTIONAL {?x ?b ?c}
• ?x same variable = same thing
5: OPTIONAL commonName
6: UNION
• Allows you to combine query patterns as an OR operation.
• Joins are still from outer to inner.
UNION
Negation
• When you do not want a certain category of matches.
SELECT ?pet WHERE {
?pet a pets:Friendly . }
Oooops
7: Not exists (Negation 1)
8: Minus (Negation 2)
MINUS{} or FILTER (NOT EXISTS{})
• Whats the difference?
– MINUS subtracts results
– NOT EXITS tests if the sub pattern is possible at all.
• Normally the faster option.
9: MINUS all data
10: FILTER (NOT EXISTS{}) no results
11: Negation option 3 SPARQL 1.0
SELECT ?subject ?rankWHERE { ?subject up:rank ?rank . OPTIONAL { ?subject up:rank up:Genus . ?subject up:rank ?genus .} FILTER(! BOUND(?genus))}
FILTERS
• You just saw it twice
– Once in the !BOUND
– Once in the NOT EXISTS
• FILTERS a result set by possibly removing values
– FILTER do not add a value to the result
• Inside the same graph pattern order independent.
12: Filter
13: Filter on not in
Using implicit AND between lines
Using implicit AND between lines
15: FILTER IN
16: FILTER using OR
FILTER on numbers
• <
– FILTER (1 < 2) (17)
• >
– FILTER (2 > 1) (18)
• =
– FILTER (1 =1) (19)
• !=
– FILTER(1 != 2) (20)
Filters
• ?x = ?y does casting (value conversions) (21)
– 1.0^^xsd:float = 1^^xsd:int is true
• sameTerm(?x, ?y) does not (22)
– sameTerm(1.0^^xsd:float, 1^^xsd:int)
FUNCTIONS for in filters and in binds
• Functions
– STRLEN
– SUBSTR
– UCASE
– LCASE
– STRSTARTS
– STRENDS
– CONTAINS
– STRBEFORE
– STRAFTER
– ENCODE_FOR_URI
– CONCAT
– langMatches
– REGEX
– REPLACE
– IRI
– STR
24: SUBSTR == substring
24: STRLEN == String Length
25: CONTAINS is case sensitive is it in there
26: REGEX, just like java|python regex
BIND
• Builds new Values
– Closes the basic graph pattern (22)
• Always declare before use.
SELECT ?p WHERE { {
?taxon a :Taxon . } BIND (?taxon AS ?p)
}
BIND existing variable to a new one
27: CONCAT
BIND can assign any output
Aggregate functions
• on select line
• limited in number
– count
– sum
– avg
– min
– max
– groupConcat
– sample
© 2013 SIB
30: count
© 2013 SIB
31: SAMPLE should give a random result back
© 2013 SIB
Follow the path
32: Path queries
33: Finding a grand parent using normal joins
34: Finding a grandParent using a path query
35: | is OR for predicate
36: Same result with UNION
37: Finding any ancestor
38: Can use the variable in a normal join afterwards
© 2013 SIB
GROUP BY
GROUP BY
• Needed for aggregate values
• After closing the where clause
– ... WHERE {?x ?y ?z} GROUP BY ?x
39: GROUP BY
HAVING
• \
I have carrot !
HAVING
• FILTER for aggregates
• After the GROUP BY clause
– ... GROUP BY ?x HAVING (count(?y) > 2)
– ... GROUP BY ?x HAVING (min(?y) = 2)
– etc...
40: HAVING
© 2013 SIB
LIMITS & OFFSET
41: LIMIT and OFFSET
• OFFSET is skip first results
• LIMIT return no more than x results
ORDER
ORDER
© 2013 SIB
VALUES
• Super BIND
• Provide inline data
Marmota marmota marmota
Examples
• Parameter lists are between ()
Text
VALUES (?annotation) { (core:Disease_Annotation) (core:Disulfide_Bond_Annotation) }
Examples
• Undef means no value at
– all not bound
Text
VALUES (?annotation ?begin) { (core:Disease_Annotation UNDEF) (core:Disulfide_Bond_Annotation 2) }
VALUES
• After declaring a set of values you can use them in your query.
SELECT ?comment WHERE { VALUES (?annotation ?begin) { (core:Disease_Annotation UNDEF) (core:Disulfide_Bond_Annotation 2) } ?annotation rdfs:comment ?comment . }
SERVICE: Using other sparql endpoints
• SERVICE<URL of other endpoint>
– Runs a sub query on the other endpoint and merges it back into your query.
“Life is better with friends who understand you.”
SERVICE
SERVICE
• Useful
– Quick experimenting with combing multiple datasources
– Quick for queries where not to much data is send to the remote point
• Slow
– When you ask for to much data
– Remote endpoint not resourced for your questions
SERVICE
• Slowly improving
• Theoretically unfixable
• Practically could be much better
• 1000 x speed up small step away
Lets make some triples
Construction
• CONSTRUCT
– New triples
• downloads RDF
– Does not update store
Constructing an owl:sameAs between two URI
INSERT
• Adds data
– like construct
DELETE
• Removes data
– Triples matching are removed from the data
– Triples can be bound using where clause
DELETE
DELETE INSERT
• Single atomic operation
• Transactions store API option
Atomic operation
© 2013 SIB
I’m exhausted now
Of Course Biology is complicated#baseURI: http://purl.uniprot.org/unirule/UR000107224#Rule UR000107224 Created by:bridge on:2009-02-12 Modified by:rantunes on:2015-06-09PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>PREFIX uniprot:<http://purl.uniprot.org/uniprot/>PREFIX sequence:<http://purl.uniprot.org/sequences/>PREFIX unirule:<http://purl.uniprot.org/unirules/>PREFIX taxon:<http://purl.uniprot.org/taxonomy/>PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>PREFIX hamap-sparql:<http://example.org/hamap_sparql/>PREFIX up:<http://purl.uniprot.org/core/>PREFIX faldo:<http://biohackathon.org/resource/faldo#>PREFIX method:<http://example.org/method/>PREFIX keyword:<http://purl.uniprot.org/keywords/>PREFIX owl:<http://www.w3.org/2002/07/owl#>PREFIX proteome:<http://purl.uniprot.org/proteomes/>PREFIX hamap:<http://purl.uniprot.org/hamap/>PREFIX annotation:<http://purl.uniprot.org/annotation/>PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>CONSTRUCT { ?this up:annotation ?annotation0, ?annotation1, ?annotation2, ?annotation3, ?annotation5; up:classifiedWith <http://purl.obolibrary.org/obo/19805>, <http://purl.obolibrary.org/obo/334>, <http://purl.obolibrary.org/obo/34354>, <http://purl.obolibrary.org/obo/43420>, <http://purl.obolibrary.org/obo/6569>, <http://purl.obolibrary.org/obo/8198>, keyword:223, keyword:560, keyword:662 . ?annotation0 a up:Function_Annotation; rdfs:comment "Catalyzes the oxidative ring opening of 3-hydroxyanthranilate to 2-amino-3-carboxymuconate semialdehyde, which spontaneously cyclizes to quinolinate." .
Questions