Я написал несколько запросов SPARQL для извлечения действий из онтологии. Однако я столкнулся с проблемой, когда третий и четвертый запросы возвращают пустые результаты, а первый и второй запросы предоставляют желаемый результат. Вот запросы:
Код: Выделить всё
import org.apache.jena.query.*;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.riot.RDFDataMgr;
public class ActivityQueries {
// Add static keyword to `ontologyFile`
static String ontologyFile = "C:\\Users\\Dell\\Desktop\\HBOOntology.OWL";
static Model model = RDFDataMgr.loadModel(ontologyFile);
private static String getQuery1() {
return "PREFIX rdf: " +
"PREFIX owl: " +
"PREFIX rdfs: " +
"PREFIX xsd: " +
"PREFIX ont: " +
"PREFIX ex: " +
"SELECT DISTINCT ?activity ?startTime ?endTime " +
"WHERE { " +
" ex:hasActivity ?activity . " +
" ?activity ex:hasStartTime ?startTime ; " +
" ex:hasEndTime ?endTime . " +
"} ";
}
// Query 2: Extract activities from Query 1 that have duration >= 5 minutes
// Query 2: Extract activities from Query 1 that have duration > 4 minutes
private static String getQuery2() {
return "PREFIX ont: " +
"PREFIX ex: " +
"PREFIX xsd: " +
"SELECT DISTINCT (STRAFTER(STR(?activity), \"#\") AS ?activityName) " +
" ?startTime " +
" ?endTime " +
"WHERE { " +
" { " +
" SELECT ?activity ?startTime ?endTime " +
" WHERE { " +
" ex:hasActivity ?activity . " +
" ?activity ex:hasStartTime ?startTime ; " +
" ex:hasEndTime ?endTime . " +
" } " +
" } " +
" FILTER ((xsd:dateTime(?endTime) - xsd:dateTime(?startTime)) > \"PT6M\"^^xsd:duration) . " +
"} ";
}
private static String getQuery3() {
return "PREFIX ont: " +
"PREFIX j0: " +
"PREFIX xsd: " +
"PREFIX rdfs: " +
"PREFIX owl: " +
"PREFIX rdf: " +
"SELECT DISTINCT ?activity1 ?activity2 ?location1 ?location2 " +
"WHERE { " +
" { " +
" SELECT ?activity1 ?startTime1 ?endTime1 ?location1 " +
" WHERE { " +
" ?activity1 a j0:Activity ; " +
" j0:hasStartTime ?startTime1 ; " +
" j0:hasEndTime ?endTime1 ; " +
" ont:hasActivityLocation ?location1 . " +
" FILTER (xsd:dateTime(?endTime1) - xsd:dateTime(?startTime1) > \"PT4M\"^^xsd:duration) . " +
" } " +
" } " +
" { " +
" SELECT ?activity2 ?startTime2 ?endTime2 ?location2 " +
" WHERE { " +
" ?activity2 a j0:Activity ; " +
" j0:hasStartTime ?startTime2 ; " +
" j0:hasEndTime ?endTime2 ; " +
" ont:hasActivityLocation ?location2 . " +
" FILTER (xsd:dateTime(?endTime2) - xsd:dateTime(?startTime2) > \"PT4M\"^^xsd:duration) . " +
" } " +
" } " +
" FILTER (xsd:dateTime(?startTime2) - xsd:dateTime(?endTime1) xsd:dateTime(?endTime1)) . " +
"} ";
}
private static String getQuery4() {
return "PREFIX ont: " +
"PREFIX j0: " +
"PREFIX xsd: " +
"PREFIX rdfs: " +
"PREFIX owl: " +
"PREFIX rdf: " +
"SELECT DISTINCT ?activity1 ?activity2 ?object1 ?object2 " +
"WHERE { " +
" ?activity1 ont:hasObject ?object1 . " +
" ?activity2 ont:hasObject ?object2 . " +
" ?activity1 a j0:Activity ; " + // Use the correct IRI for Activity
" j0:hasStartTime ?startTime1 ; " +
" j0:hasEndTime ?endTime1 . " +
" ?activity2 a j0:Activity ; " + // Use the correct IRI for Activity
" j0:hasStartTime ?startTime2 ; " +
" j0:hasEndTime ?endTime2 . " +
" FILTER (xsd:dateTime(?startTime2) - xsd:dateTime(?endTime1) xsd:dateTime(?endTime1)) . " +
"} ";
}
public static void main(String[] args) {
// Load the RDF model and display it in the console (optional)
/*RDFDataMgr.write(System.out, model, org.apache.jena.riot.RDFFormat.TURTLE);*/
// Define the queries
String query1 = getQuery1();
String query2 = getQuery2();
String query3 = getQuery3();
String query4 = getQuery4();
// Execute Query 1
System.out.println("Results for Query 1:");
try (QueryExecution qExec = QueryExecutionFactory.create(QueryFactory.create(query1), model)) {
ResultSet results = qExec.execSelect();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
System.out.println(soln);
}
}
// Execute Query 2
System.out.println("\nResults for Query 2:");
try (QueryExecution qExec = QueryExecutionFactory.create(QueryFactory.create(query2), model)) {
ResultSet results = qExec.execSelect();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
System.out.println(soln);
}
}
// Execute Query 3
System.out.println("\nResults for Query 3:");
try (QueryExecution qExec = QueryExecutionFactory.create(QueryFactory.create(query3), model)) {
ResultSet results = qExec.execSelect();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
System.out.println(soln);
}
}
// Execute Query 4
System.out.println("\nResults for Query 4:");
try (QueryExecution qExec = QueryExecutionFactory.create(QueryFactory.create(query4), model)) {
ResultSet results = qExec.execSelect();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
System.out.println(soln);
}
}
} // Close the main method
} // Close the class definition
Подробнее здесь: https://stackoverflow.com/questions/791 ... s-expected