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}