aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/rsacomb/RDFTriple.scala
blob: 11ad6d4206305a373d65801a92409a6a1b83d82b (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
package rsacomb

import tech.oxfordsemantic.jrdfox.logic.{Atom, IRI, TupleTableName}

trait RDFTriple {

  implicit class RDFTriple(atom: Atom) {

    /* 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.getIRI.equals("internal:triple")

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

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

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

}