-
Notifications
You must be signed in to change notification settings - Fork 1
/
rule2sed.sparql
87 lines (76 loc) · 3.42 KB
/
rule2sed.sparql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# given an OntoLex-Morph vocabulary with inflection rules
# for every inflection type, generate sed scripts to produce all follow-up states
#############################
# exhaustive implementation #
#############################
# we return a single path for every start state (itype) and every intermediate state
# PRO: capable of creating multiple paths
# CON: risk of combinatorial explosion; may skrew up transformation order (!)
PREFIX ontolex: <http://www.w3.org/ns/lemon/ontolex#>
PREFIX synsem: <http://www.w3.org/ns/lemon/synsem#>
PREFIX decomp: <http://www.w3.org/ns/lemon/decomp#>
PREFIX vartrans: <http://www.w3.org/ns/lemon/vartrans#>
PREFIX lime: <http://www.w3.org/ns/lemon/lime#>
PREFIX morph: <http://www.w3.org/ns/lemon/morph#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX skos: <http://www.w3.org/2004/02/skos#>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX void: <http://rdfs.org/ns/void#>
PREFIX lexinfo: <http://www.lexinfo.net/ontology/2.0/lexinfo#>
PREFIX semiotics: <http://www.ontologydesignpatterns.org/cp/owl/semiotics.owl#>
PREFIX oils: <http://lemon-model.net/oils#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX provo: <http://www.w3.org/ns/prov#>
SELECT DISTINCT ?itype ?transformation # ?pathid
WHERE {
# # If GROUP_CONCAT would preserve search order, the following would give us
# # a sequence of replacements as defined in the sequence of InflectionTypes.
# # HOWEVER: In SPARQL 1.1, this is not the default behavior. Instead, order
# # is nondeterministic. Whether it works will be implementation-specific.
# # For Apache Jena, it *seems* to work, but not if additional constraints
# # are added.
# { SELECT ?a (GROUP_CONCAT(?repl; separator="; ") as ?replacements)
# WHERE {
# ?a a morph:InflectionType; morph:next* ?b.
# ?b morph:inflectionRule/morph:replacement ?repl.
# FILTER(?repl != "s/$//")
# } GROUP BY ?a
# }
# The implementation above amalgamates all paths from ?a.
# We use a ?pathid to disentangle these.
# However, the query for the ?pathid apparently destroys the original search order
{ SELECT ?a ?end ?pathid (GROUP_CONCAT(?repl; separator="; ") as ?replacements)
WHERE {
?a a morph:InflectionType.
?a morph:next* ?b.
?b morph:inflectionRule/morph:replacement ?repl.
FILTER(?repl != "s/$//")
?b morph:next* ?end.
MINUS { ?end a morph:InflectionType; morph:next [] }
OPTIONAL {
?a morph:next* ?tmp.
?tmp morph:next* ?end.
?tmp morph:next* ?b
}
OPTIONAL {
?a morph:next* ?tmp.
?tmp morph:next* ?end.
?b morph:next* ?tmp
}
BIND(replace(str(?tmp),".*[/#]","") as ?pathid)
} GROUP BY ?a ?end ?pathid
}
#BIND(replace(str(?a),".*[#/]","") as ?itype) # for debugging
BIND(?a as ?itype) # production mode
# a transformation succeeds if no tags remain in the result
# we cannot get there because we don't have the morphophonological rules
# a brute force approximation is to drop all tags
# but we mark non-complete forms with a *
BIND(concat(?replacements, "; s/^\\(.*<\\)/\\*\\1/; s/<[^>]*>//g;") as ?transformation)
# a Morphisto/SMOR convention seems to be that tags have the same name as the associated states
# and final states are marked with #
}