Diamond Topic Map Query Language (DTMQL) was desined to query topic maps stored in RDB.
DTMQL uses SQL syntax with embeded 'dtmql' blocks. These blocks are predicate clauses in DNF form:
(p1,1 ∧ p2,2 ∧ ... ∧ p1,k1)
CREATE OR REPLACE VIEW dtmql_rules.author AS
SELECT "$AUTHOR" as arg1
FROM dtmql : { is-author-of($AUTHOR : author) } t;
SELECT tmo_methods.getTopicName("$AUTHOR")
FROM dtmql : { is-author-of($AUTHOR : author, $WORK : opus) } t;
SELECT tmo_methods.getTopicName("$AUTHOR")
FROM dtmql : { is-author-of($AUTHOR : author, $WORK : opus) } t
ORDER BY tmo_methods.getTopicName("$AUTHOR");
SELECT CASE WHEN "$V_EN" IS NOT NULL THEN "$V_EN"
WHEN "$V_DE" IS NOT NULL THEN "$V_DE"
ELSE "$V_UN" END
FROM dtmql : {
tutorial($D),
topic-name($D,$N_UN),
scope($N_UN,unconstrained-scope),
value($N_UN,$V_UN)
} un
LEFT OUTER JOIN
dtmql : {
tutorial($D),
topic-name($D,$N_DE),
scope($N_DE,de),
value($N_DE,$V_DE)
} de
USING ("$D")
LEFT OUTER JOIN
dtmql : {
tutorial($D),
topic-name($D,$N_EN),
scope($N_EN,en),
value($N_EN,$V_EN)
} en
USING ("$D");
SELECT tmo_methods.getTopicName("$AUTHOR")
FROM dtmql : {
person($PERSON),
not(is-author-of($PERSON : author))
} t;
SELECT tmo_methods.getTopicName("$PERSON"), tmo_methods.getTopicName("$WORK")
FROM {is-author-of($PERSON : author, $WORK : opus)} t;
SELECT tmo_methods.getTopicName("$TUTORIAL")
FROM dtmql : {
tutorial($TUTORIAL),
publication-date($TUTORIAL, $DATE)
} t
ORDER BY "$DATE" DESC;
SELECT tmo_methods.getItem("$TUTORIAL")
FROM dtmql : {
tutorial($TUTORIAL),
publication-date($TUTORIAL, $DATE)
} t
ORDER BY "$DATE"
LIMIT 2 OFFSET 3;
SELECT "$DOCUMENT"
FROM dtmql : {
document($DOCUMENT),
download($DOCUMENT, $URL)
} t;
SELECT "$EMAIL"
FROM dtmql : {
is-author-of($AUTHOR : author, $DOCUMENT : opus),
email($AUTHOR, $EMAIL),
not(download($DOCUMENT))
} t;
SELECT tmo_methods.getTopicName("$AUTHOR")
FROM dtmql : { is-author-of($AUTHOR : author, $DOCUMENT : opus) } t
GROUP BY "$AUTHOR" HAVING count("$DOCUMENT") > 1;
SELECT DISTINCT tmo_methods.getTopicName("$A")
FROM dtmql : { is-author-of($A : author, $D : opus) } t
WHERE "$A" NOT IN (
SELECT "$A1" FROM dtmql : {
is-author-of($A1 : author, $D : opus),
is-author-of($A2 : author, $D : opus),
$A1 <> $A2
} t
); -- -- This requires a PL/perl function, which is not yet written --
SELECT "$DOCUMENT"
FROM dtmql : { abstract($DOCUMENT, $ABSTRACT,en) } t
WHERE
lower("$ABSTRACT") like '%topic map%'
OR lower("$ABSTRACT") like '%topic maps%';
SELECT "$DOCUMENT"
FROM dtmql : {
document($DOCUMENT),
topic-name($DOCUMENT, $NAME),
scope($NAME, de)
} t;
-- -- This requires a PL/PgSQL string compare function, which is not yet written --
SELECT "$TOPIC"
FROM dtmql : { subject-locator($TOPIC, $URI) } t
WHERE "$URI" like '%ontopia.net%';
SELECT "$DOCUMENT"
FROM dtmql : {
document($DOCUMENT),
not(language($DOCUMENT, "english"))
} t;
CREATE TEMPORARY TABLE "indirect-influence" AS
SELECT "$OID" as oid, "$PID" as pid
FROM
dtmql : { is-influenced-by($OID : influenced, $PID : influence) } t;
SELECT "$INFLUENCED","$INFLUENCE"
FROM
dtmql : { is-author-of($INFLUENCE : opus, steve-pepper : author) } t
NATURAL JOIN
dia_walkRecursive('"indirect-influence"') AS anc("$INFLUENCED","$INFLUENCE");
SELECT "$DOCUMENT"
FROM dtmql : {
tutorial($DOCUMENT) | tutorial($DOCUMENT)
} t;
SELECT "$V","$CLASS"
FROM dtmql : {
is-author-of($AUTHOR : author, $DOCUMENT : opus),
direct-instance-of($DOCUMENT, $CLASS),
topic-name($DOCUMENT, $TITLE),
value($TITLE,$V)
} t;
SELECT tmo_methods.getItem("$AUTHOR")
FROM dtmql : { is-author-of($AUTHOR : author, $DOCUMENT : opus) } t;
SELECT tmo_methods.getItem("$TNAME")
FROM dtmql : {
is-author-of($AUTHOR : author, $DOCUMENT : opus),
topic-name($AUTHOR, $TNAME)
} t;
SELECT tmo_methods.item("$OCC")
FROM dtmql : { occurrence($TOPIC, $OCC), type($OCC, email) } t;