/
SparqlOps.scala
87 lines (68 loc) · 2.81 KB
/
SparqlOps.scala
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
package org.w3.banana
import scala.util._
object SparqlOps {
def apply[Rdf <: RDF](implicit sparqlOps: SparqlOps[Rdf]): SparqlOps[Rdf] = sparqlOps
def withPrefixes[Rdf <: RDF](query: String, prefixes: Seq[Prefix[Rdf]]): String =
if (prefixes.isEmpty) {
query
} else {
val builder = new java.lang.StringBuilder
prefixes.foreach { prefix =>
val prefixDefinition = s"prefix ${prefix.prefixName}: <${prefix.prefixIri}>\n"
builder.append(prefixDefinition)
}
builder.append(query)
builder.toString
}
}
trait SparqlOps[Rdf <: RDF] extends syntax.SparqlSyntax[Rdf] {
def parseSelect(query: String, prefixes: Seq[Prefix[Rdf]]): Try[Rdf#SelectQuery]
def parseConstruct(query: String, prefixes: Seq[Prefix[Rdf]]): Try[Rdf#ConstructQuery]
def parseAsk(query: String, prefixes: Seq[Prefix[Rdf]]): Try[Rdf#AskQuery]
def parseUpdate(query: String, prefixes: Seq[Prefix[Rdf]]): Try[Rdf#UpdateQuery]
/**
* A general query constructor.
*
* When this is used it is usually because the query type is not
* known in advance, ( as when a query is received over the
* internet). As a result the response is a validation, as the
* query may not have been tested for validity.
*
* @param query a Sparql query
* @return A validation containing the Query
*/
def parseQuery(query: String, prefixes: Seq[Prefix[Rdf]]): Try[Rdf#Query]
/**
* A fold operation.
* The types returned will be very disjunctive. Consider having T be a scalaz.Either3
*/
def fold[T](query: Rdf#Query)(
select: Rdf#SelectQuery => T,
construct: Rdf#ConstructQuery => T,
ask: Rdf#AskQuery => T): T
def getNode(solution: Rdf#Solution, v: String): Try[Rdf#Node]
def varnames(solution: Rdf#Solution): Set[String]
def solutionIterator(solutions: Rdf#Solutions): Iterator[Rdf#Solution]
/**************/
// TODO move all that stuff: there should be only function definitions here
//
// def SelectQuery(query: String, prefix: Prefix[Rdf], prefixes: Prefix[Rdf]*): Rdf#SelectQuery = {
// val completeQuery = buildQuery(query, prefix +: prefixes.toSeq)
// SelectQuery(completeQuery)
// }
//
// def ConstructQuery(query: String, prefix: Prefix[Rdf], prefixes: Prefix[Rdf]*): Rdf#ConstructQuery = {
// val completeQuery = buildQuery(query, prefix +: prefixes.toSeq)
// ConstructQuery(completeQuery)
// }
//
// def AskQuery(query: String, prefix: Prefix[Rdf], prefixes: Prefix[Rdf]*): Rdf#AskQuery = {
// val completeQuery = buildQuery(query, prefix +: prefixes.toSeq)
// AskQuery(completeQuery)
// }
//
// def UpdateQuery(query: String, prefix: Prefix[Rdf], prefixes: Prefix[Rdf]*): Rdf#UpdateQuery = {
// val completeQuery = buildQuery(query, prefix +: prefixes.toSeq)
// UpdateQuery(completeQuery)
// }
}