SQWRL: a Query Language for OWL
Martin O’Connor, Amar Das
Stanford Center for Biomedical Informatics Research,
Stanford University
SWRL and Querying
• SWRL is a rule language, not a query
language
• However, a rule antecedent can be viewed as
a pattern matching specification, i.e., a query
• With built-ins, language compliant query
extensions are possible
• Hence: SQWRL (Semantic Query-Enhanced
Web Rule Language; pronounced squirrel)
Example SWRL Rule: is adult?
Classify all persons in an ontology with an age greater than 17 as adults.
Person(?p) ^ hasAge(?p,?age) ^ swrlb:greaterThan(?age,17)
→ Adult(?p)
Example SQWRL Query
List all persons in an ontology with an age greater than 17.
Person(?p) ^ hasAge(?p,?age) ^ swrlb:greaterThan(?age,17)
→ sqwrl:select(?p, ?age)
Example SQWRL Query:
Ordering Results
List all persons in an ontology with an age greater than 17 and order
the result by age in ascending order.
Person(?p) ^ hasAge(?p,?age) ^ swrlb:greaterThan(?age,17)
→ sqwrl:select(?p, ?age) ^ sqwrl:orderBy(?age)
Also: orderByDecending
Example SQWRL Query:
Counting Results
Count all cars in ontology.
Car(?c) → sqwrl:count(?c)
Important: no way of asserting count in ontology!
Example SQWRL Query:
Aggregating Results
Average age of persons in ontology.
Person(?p) ^ hasAge(?p, ?age) →
sqwrl:avg(?age)
Also: sqwrl:max, sqwrl:min, sqwrl:sum
Example SQWRL Query:
Arbitrary OWL Class Expressions
Individuals with cardinality restrictions.
(hasChild >= 1)(?x) → sqwrl:select(?x)
SQWRL can act as a DL query language
Semantics (Briefly)
• Any SWRL body is valid query
specification
• Does not violate OWA
• Does assume UNA
Useful but Relatively Inexpressive
• Useful but relatively inexpressive. Needs:
– Negation As Failure
– Disjunction
– Complex Counting
– Complex Aggregation
• We have recently added sets to the
language to tackle these problems
SQWRL: Basic Set Operator
Count all persons in ontology.
Person(?p) °
sqwrl:makeSet(?s, ?p) ^ sqwrl:size(?size, ?s)
→ sqwrl:select(?size)
Ser operators: sqwrl:isEmpty, sqwrl:union, sqwrl:difference
SQWRL: Negation as Failure
List the number of non beta blocker drugs in ontology.
Drug(?d) ^ BetaBlocker(?b) °
sqwrl:makeSet(?s1, ?d) ^ sqwrl:makeSet(?s2, ?b) ^
sqwrl:difference(?s3, ?s1, ?s2) ^ sqwrl:size(?size, ?s3)
→ sqwrl:select(?size)
SQWRL: Disjunction
List the number of beta blocker or anti-hypertensive drugs in ontology.
AntiHypertensive(?d1) ^ BetaBlocker(?d2) °
sqwrl:makeSet(?s1, ?d1) ^ sqwrl:makeSet(?s2, ?d2) ^
sqwrl:union(?s3, ?s1, ?s2) ^ sqwrl:size(?size, ?s3)
→ sqwrl:select(?size)
SQWRL: Complex Counting
List all patients on more than two drugs.
Patient(?p) ^ hasDrug(?p,?d) °
sqwrl:makeSet(?s, ?d) ^ sqwrl:groupBy(?s, ?p) ^
sqwrl:size(?n, ?s) ^ swrlb:greaterThan(?n, 2)
→ sqwrl:select(?p)
SQWRL: Complex Aggregation
List the average dose of each drug taken by each patient.
Patient(?p) ^ hasDrug(?p,?d) ^ hasDose(?d, ?dose) °
sqwrl:makeSet(?s, ?dose) ^ sqwrl:groupBy(?s, ?p, ?d) ^
sqwrl:avg(?avg, ?s)
→ sqwrl:select(?p, ?d, ?avg)
SQWRL: NAF, Disjunction,
Complex Counting and Aggregation
List the average dose of patients that are on more than two drugs and where
none of those drugs is a beta blocker or anti-hypertensive.
Patient(?p) ^ hasDrug(?p,?d) ^ hasDose(?d, ?dose) ^
BetaBlocker(?d1) ^ AntiHypertensive(?d2) °
sqwrl:makeSet(?s1, ?dose) ^ sqwrl:groupBy(?s1, ?p, ?d) ^
sqwrl:makeSet(?s2, ?drug) ^ sqwrl:groupBy(?s2, ?p) ^
sqwrl:makeSet(?s3, ?d1, ?d2) ^
sqwrl:avg(?avg, ?s1) ^
sqwrl:size(?n, ?s2) ^ swrlb:greaterThan(?n, 2) ^
sqwrl:intersection(?s4, ?s2, ?s3) ^ sqwrl:isEmpty(?s4)
→ sqwrl:select(?p, ?d, ?avg)
Advantages of SWRL-Based
Query Language
• No need to invent a new semantics
• Standard(ish) presentation syntax (° is syntactic sugar)
• Standard serialization
• Can use existing reasoning infrastructure
• Can use existing editors
• On-the-fly query checking in editors
• For SWRL users, easy to learn
• Extensible with built-ins (TBox, RDF,XML…)
• Useful for debugging SWRL rules
• Queries can interoperate with rules
• Not SPARQL!
Summary
• Core language features available for 1+
years in Protege-OWL
• Set operators will be available in month or so
• Plans for Protege4 port