001package conexp.fx.gui.dataset;
002
003/*
004 * #%L
005 * Concept Explorer FX
006 * %%
007 * Copyright (C) 2010 - 2023 Francesco Kriegel
008 * %%
009 * This program is free software: you can redistribute it and/or modify
010 * it under the terms of the GNU General Public License as
011 * published by the Free Software Foundation, either version 3 of the
012 * License, or (at your option) any later version.
013 * 
014 * This program is distributed in the hope that it will be useful,
015 * but WITHOUT ANY WARRANTY; without even the implied warranty of
016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
017 * GNU General Public License for more details.
018 * 
019 * You should have received a copy of the GNU General Public
020 * License along with this program.  If not, see
021 * <http://www.gnu.org/licenses/gpl-3.0.html>.
022 * #L%
023 */
024
025import java.io.File;
026import java.util.List;
027import java.util.Set;
028import java.util.stream.Collectors;
029
030import org.openrdf.model.Statement;
031import org.openrdf.query.BindingSet;
032import org.openrdf.query.MalformedQueryException;
033import org.openrdf.query.QueryEvaluationException;
034import org.openrdf.query.QueryLanguage;
035import org.openrdf.query.TupleQuery;
036import org.openrdf.query.TupleQueryResult;
037import org.openrdf.repository.Repository;
038import org.openrdf.repository.RepositoryConnection;
039import org.openrdf.repository.RepositoryException;
040import org.openrdf.repository.sail.SailRepository;
041import org.openrdf.sail.memory.MemoryStore;
042//import org.semanticweb.owlapi.model.IRI;
043
044import conexp.fx.core.builder.Requests;
045//import conexp.fx.core.dl.deprecated.OWLInterpretation;
046import conexp.fx.core.importer.RDFImporter;
047import conexp.fx.core.util.FileFormat;
048import conexp.fx.gui.ConExpFX;
049import conexp.fx.gui.assistent.ModelAssistent;
050import conexp.fx.gui.task.TimeTask;
051import info.aduna.iteration.Iterations;
052import javafx.beans.property.ReadOnlyStringWrapper;
053import javafx.collections.FXCollections;
054import javafx.collections.ObservableList;
055import javafx.scene.control.Button;
056import javafx.scene.control.TableColumn;
057import javafx.scene.control.TableView;
058import javafx.scene.control.TextArea;
059import javafx.scene.layout.BorderPane;
060import javafx.scene.layout.Pane;
061import javafx.scene.text.Font;
062
063@Deprecated
064public class RDFDataset extends Dataset {
065
066  private final Repository                repository = new SailRepository(new MemoryStore());
067  private final ObservableList<Statement> statements = FXCollections.observableArrayList();
068
069  public RDFDataset(final File file, final FileFormat format) {
070    super(null, file, format);
071    try {
072      repository.initialize();
073    } catch (RepositoryException e) {
074      throw new RuntimeException(e);
075    }
076    views.add(new DatasetView<Repository>("Triples", createTriplesView(), repository));
077    views.add(new DatasetView<Repository>("Query", createQueryView(), repository));
078    defaultActiveViews.add("Triples");
079    actions.add(new DatasetAction("New SPARQL Context...", () -> {
080      return;
081    }));
082//    actions.add(new DatasetAction("New DL Model...", () -> new ModelAssistent(this).showAndWait()));
083    initialize();
084  }
085
086  public final void initialize() {
087    if (format.equals(FileFormat.CSVT))
088      ConExpFX.execute(TimeTask.create(this, "Importing RDF Dataset", () -> RDFImporter.readCSV(repository, file)));
089    else
090      ConExpFX.execute(TimeTask.create(this, "Importing RDF Dataset", () -> RDFImporter.read(repository, file)));
091    ConExpFX.execute(TimeTask.create(this, "Preparing Statements View", () -> {
092      try {
093        RepositoryConnection connection = repository.getConnection();
094        Iterations.addAll(connection.getStatements(null, null, null, true), statements);
095        connection.close();
096
097      } catch (RepositoryException e) {
098        throw new RuntimeException(e);
099      }
100    }));
101  }
102
103  private final TableView<Statement> createTriplesView() {
104    TableView<Statement> table = new TableView<>(statements);
105    final TableColumn<Statement, String> subjectColumn = new TableColumn<Statement, String>("Subject");
106    final TableColumn<Statement, String> predicateColumn = new TableColumn<Statement, String>("Predicate");
107    final TableColumn<Statement, String> objectColumn = new TableColumn<Statement, String>("Object");
108    subjectColumn.setCellValueFactory(f -> new ReadOnlyStringWrapper(f.getValue().getSubject().stringValue()));
109    predicateColumn.setCellValueFactory(f -> new ReadOnlyStringWrapper(f.getValue().getPredicate().stringValue()));
110    objectColumn.setCellValueFactory(f -> new ReadOnlyStringWrapper(f.getValue().getObject().stringValue()));
111    table.getColumns().addAll(subjectColumn, predicateColumn, objectColumn);
112    return table;
113  }
114
115  private final Pane createQueryView() {
116    final BorderPane repositoryView = new BorderPane();
117    final TextArea queryArea = new TextArea();
118    queryArea.setFont(Font.font(java.awt.Font.MONOSPACED, 14));
119    final Button queryButton = new Button("Query");
120    repositoryView.setTop(new BorderPane(queryArea, null, queryButton, null, null));
121    final TableView<BindingSet> table = new TableView<BindingSet>(FXCollections.observableArrayList());
122    repositoryView.setCenter(table);
123    queryButton.setOnAction(__ -> {
124      try {
125        final RepositoryConnection connection = repository.getConnection();
126        final TupleQuery query = connection.prepareTupleQuery(QueryLanguage.SPARQL, queryArea.getText());
127        final TupleQueryResult result = query.evaluate();
128        table.getColumns().clear();
129        result.getBindingNames().forEach(b -> {
130          final TableColumn<BindingSet, String> column = new TableColumn<BindingSet, String>(b);
131          column.setCellValueFactory(f -> new ReadOnlyStringWrapper(f.getValue().getValue(b).stringValue()));
132          table.getColumns().add(column);
133        });
134        table.getItems().clear();
135        while (result.hasNext())
136          table.getItems().add(result.next());
137        result.close();
138        connection.close();
139      } catch (RepositoryException | MalformedQueryException | QueryEvaluationException e) {
140        throw new RuntimeException(e);
141      }
142    });
143    return repositoryView;
144  }
145
146  public final ObservableList<Statement> getTriples() {
147    return statements;
148  }
149
150//  public final Set<IRI> getRoles() {
151//    return statements.parallelStream().map(s -> IRI.create(s.getPredicate().stringValue())).collect(Collectors.toSet());
152//  }
153
154  public final void createFormalContextFromSPARQLQuery(final String query) {
155    ConExpFX.execute(TimeTask.create(this, "Extracting SPARQL Context", () -> {
156      ConExpFX.instance.treeView.addDataset(
157          new FCADataset<>(RDFDataset.this, new Requests.Import.ImportSPARQLFromRepository(repository, query)));
158    }));
159  }
160
161//  public final void
162//      createDLModel(List<IRI> selectedConceptNames, List<IRI> selectedRoleNames, IRI selectedIsARoleName) {
163////    ConExpFX.execute(TimeTask.create(this, "Extracting DL Model", () -> {
164////      final OWLInterpretation i =
165////          RDFImporter.extractInterpretation(statements, selectedConceptNames, selectedRoleNames, selectedIsARoleName);
166////      ConExpFX.instance.treeView.addDataset(new DLDataset(RDFDataset.this, i));
167////    }));
168//  }
169
170  @Override
171  public void save() {
172    // TODO Auto-generated method stub
173
174  }
175
176  @Override
177  public void saveAs() {
178    // TODO Auto-generated method stub
179
180  }
181
182  @Override
183  public void export() {
184    // TODO Auto-generated method stub
185
186  }
187
188  @Override
189  public void close() {
190    // TODO Auto-generated method stub
191
192  }
193
194}