diff options
Diffstat (limited to 'src/main/scala/rsacomb/RDFTriple.scala')
-rw-r--r-- | src/main/scala/rsacomb/RDFTriple.scala | 131 |
1 files changed, 79 insertions, 52 deletions
diff --git a/src/main/scala/rsacomb/RDFTriple.scala b/src/main/scala/rsacomb/RDFTriple.scala index 4054d42..a65c168 100644 --- a/src/main/scala/rsacomb/RDFTriple.scala +++ b/src/main/scala/rsacomb/RDFTriple.scala | |||
@@ -1,60 +1,87 @@ | |||
1 | package rsacomb | 1 | package rsacomb.implicits |
2 | 2 | ||
3 | import tech.oxfordsemantic.jrdfox.logic.datalog.{TupleTableAtom, TupleTableName} | 3 | import tech.oxfordsemantic.jrdfox.logic.Datatype |
4 | import tech.oxfordsemantic.jrdfox.logic.expression.{Literal, FunctionCall} | ||
5 | import tech.oxfordsemantic.jrdfox.logic.datalog.{ | ||
6 | BindAtom, | ||
7 | TupleTableAtom, | ||
8 | TupleTableName | ||
9 | } | ||
4 | import tech.oxfordsemantic.jrdfox.logic.expression.{IRI} | 10 | import tech.oxfordsemantic.jrdfox.logic.expression.{IRI} |
11 | import scala.collection.JavaConverters._ | ||
5 | 12 | ||
6 | trait RDFTriple { | 13 | import rsacomb.suffix.{RSASuffix, Nth} |
7 | 14 | import rsacomb.RSA | |
8 | implicit class RDFTriple(atom: TupleTableAtom) { | 15 | |
9 | 16 | /* Is this the best way to determine if an atom is an RDF triple? | |
10 | /* Is this the best way to determine if an atom is an RDF triple? | 17 | * Note that we can't use `getNumberOfArguments()` because is not |
11 | * Note that we can't use `getNumberOfArguments()` because is not | 18 | * "consistent": |
12 | * "consistent": | 19 | * - for an atom created with `rdf(<term1>, <term2>, <term3>)`, |
13 | * - for an atom created with `rdf(<term1>, <term2>, <term3>)`, | 20 | * `getNumberOfArguments` returns 3 |
14 | * `getNumberOfArguments` returns 3 | 21 | * - for an atom created with `Atom.create(<tupletablename>, <term1>, |
15 | * - for an atom created with `Atom.create(<tupletablename>, <term1>, | 22 | * <term2>, <term3>)`, `getNumberOfArguments()` returns 3 |
16 | * <term2>, <term3>)`, `getNumberOfArguments()` returns 3 | 23 | * |
17 | * | 24 | * This is probably because `Atom.rdf(...) is implemented as: |
18 | * This is probably because `Atom.rdf(...) is implemented as: | 25 | * ```scala |
19 | * ```scala | 26 | * def rdf(term1: Term, term2: Term, term3: Term): Atom = |
20 | * def rdf(term1: Term, term2: Term, term3: Term): Atom = | 27 | * Atom.create(TupleTableName.create("internal:triple"), term1, term2, term3) |
21 | * Atom.create(TupleTableName.create("internal:triple"), term1, term2, term3) | 28 | * ``` |
22 | * ``` | 29 | */ |
23 | */ | 30 | |
24 | def isRdfTriple: Boolean = | 31 | trait RSAAtom { |
25 | atom.getTupleTableName.getName.equals("internal:triple") | 32 | |
26 | 33 | implicit class RSAAtom(val atom: TupleTableAtom) { | |
27 | def isClassAssertion: Boolean = | 34 | |
28 | atom.isRdfTriple && atom.getArguments.get(1).equals(IRI.RDF_TYPE) | 35 | import rsacomb.RDFoxUtil.stringToRDFoxIRI |
29 | 36 | ||
30 | def isRoleAssertion: Boolean = | 37 | val name: String = atom.getTupleTableName.getName |
31 | atom.isRdfTriple && !atom.getArguments.get(1).equals(IRI.RDF_TYPE) | 38 | |
32 | 39 | val isRDF: Boolean = name == "internal:triple" | |
33 | def suffix(sx: String): TupleTableAtom = | 40 | |
34 | if (this.isClassAssertion) { | 41 | val isClassAssertion: Boolean = { |
35 | val newclass = atom.getArguments.get(2) match { | 42 | isRDF && { |
36 | case iri: IRI => IRI.create(s"${iri.getIRI}_$sx") | 43 | val pred = atom.getArguments.get(1) |
37 | case other => other | 44 | pred == IRI.RDF_TYPE |
38 | } | 45 | } |
39 | TupleTableAtom.rdf( | 46 | } |
40 | atom.getArguments.get(0), | 47 | |
41 | atom.getArguments.get(1), | 48 | val isRoleAssertion: Boolean = isRDF && !isClassAssertion |
42 | newclass | 49 | |
43 | ) | 50 | def <<(suffix: RSASuffix): TupleTableAtom = |
44 | } else if (this.isRoleAssertion) { | 51 | if (isRDF) { |
45 | val newrole = atom.getArguments.get(1) match { | 52 | val subj = atom.getArguments.get(0) |
46 | case iri: IRI => IRI.create(s"${iri.getIRI}_$sx") | 53 | val pred = atom.getArguments.get(1) |
47 | case other => other | 54 | val obj = atom.getArguments.get(2) |
55 | if (isClassAssertion) { | ||
56 | val obj1 = obj match { | ||
57 | case iri: IRI => IRI.create(iri.getIRI :: suffix) | ||
58 | case other => other | ||
59 | } | ||
60 | TupleTableAtom.rdf(subj, pred, obj1) | ||
61 | } else { | ||
62 | val pred1 = pred match { | ||
63 | case iri: IRI => IRI.create(iri.getIRI :: suffix) | ||
64 | case other => other | ||
65 | } | ||
66 | TupleTableAtom.rdf(subj, pred1, obj) | ||
48 | } | 67 | } |
49 | TupleTableAtom.rdf( | ||
50 | atom.getArguments.get(0), | ||
51 | newrole, | ||
52 | atom.getArguments.get(2) | ||
53 | ) | ||
54 | } else { | 68 | } else { |
55 | val newname = | 69 | val ttname = TupleTableName.create(name :: suffix) |
56 | TupleTableName.create(s"${atom.getTupleTableName.getName}_$sx") | 70 | TupleTableAtom.create(ttname, atom.getArguments()) |
57 | TupleTableAtom.create(newname, atom.getArguments()) | 71 | } |
72 | |||
73 | lazy val reified: (Option[BindAtom], List[TupleTableAtom]) = | ||
74 | if (isRDF) { | ||
75 | (None, List(atom)) | ||
76 | } else { | ||
77 | val bvar = RSA.getFreshVariable() | ||
78 | val str = Literal.create(name, Datatype.XSD_STRING) | ||
79 | val args = atom.getArguments.asScala.toList | ||
80 | val skolem = FunctionCall.create("SKOLEM", str :: args: _*) | ||
81 | val bind = BindAtom.create(skolem, bvar) | ||
82 | val atoms = args.zipWithIndex | ||
83 | .map { case (t, i) => TupleTableAtom.rdf(bvar, name :: Nth(i), t) } | ||
84 | (Some(bind), atoms) | ||
58 | } | 85 | } |
59 | } | 86 | } |
60 | 87 | ||