aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/rsacomb/RDFTriple.scala
blob: 9e593df7210811cbdac8907f39153b39b553a738 (plain) (blame)
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
package rsacomb

import tech.oxfordsemantic.jrdfox.logic.datalog.{TupleTableAtom, TupleTableName}
import tech.oxfordsemantic.jrdfox.logic.expression.{IRI}

trait RDFTriple {

  implicit class RDFTriple(atom: TupleTableAtom) {

    /* Is this the best way to determine if an atom is an RDF triple?
     * Note that we can't use `getNumberOfArguments()` because is not
     * "consistent":
     * - for an atom created with `rdf(<term1>, <term2>, <term3>)`,
     * `getNumberOfArguments` returns 3
     * - for an atom created with `Atom.create(<tupletablename>, <term1>,
     * <term2>, <term3>)`, `getNumberOfArguments()` returns 3
     *
     * This is probably because `Atom.rdf(...) is implemented as:
     * ```scala
     *  def rdf(term1: Term, term2: Term, term3: Term): Atom =
     *    Atom.create(TupleTableName.create("internal:triple"), term1, term2, term3)
     * ```
     */
    def isRdfTriple: Boolean =
      atom.getTupleTableName.getName.equals("internal:triple")

    def isClassAssertion: Boolean =
      atom.isRdfTriple && atom.getArguments.get(1).equals(IRI.RDF_TYPE)

    def isRoleAssertion: Boolean =
      atom.isRdfTriple && !atom.getArguments.get(1).equals(IRI.RDF_TYPE)

    def suffix(sx: String): TupleTableAtom =
      if (this.isClassAssertion) {
        val newclass = atom.getArguments.get(2) match {
          case iri: IRI => IRI.create(iri.getIRI.appendedAll(sx))
          case other    => other
        }
        TupleTableAtom.rdf(
          atom.getArguments.get(0),
          atom.getArguments.get(1),
          newclass
        )
      } else if (this.isRoleAssertion) {
        val newrole = atom.getArguments.get(1) match {
          case iri: IRI => IRI.create(iri.getIRI.appendedAll(sx))
          case other    => other
        }
        TupleTableAtom.rdf(
          atom.getArguments.get(0),
          newrole,
          atom.getArguments.get(2)
        )
      } else {
        val newname =
          TupleTableName.create(atom.getTupleTableName.getName.appendedAll(sx))
        TupleTableAtom.create(newname, atom.getArguments())
      }
  }

}