knowrob  2.1.0
A Knowledge Base System for Cognition-enabled Robots
semweb.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of KnowRob, please consult
3  * https://github.com/knowrob/knowrob for license details.
4  */
5 
6 #define PL_SAFE_ARG_MACROS
7 
8 #include <SWI-cpp.h>
9 
10 #include "knowrob/reasoner/prolog/semweb.h"
11 #include "knowrob/reasoner/prolog/PrologReasoner.h"
12 #include "knowrob/reasoner/ReasonerManager.h"
13 #include "knowrob/semweb/ImportHierarchy.h"
14 #include "knowrob/semweb/OntologyFile.h"
15 #include "knowrob/URI.h"
16 
17 using namespace knowrob;
18 
19 static inline std::shared_ptr<ImportHierarchy> getImportHierarchy(term_t t_manager, term_t t_reasoner) {
20  static std::shared_ptr<ImportHierarchy> null;
21  auto definedReasoner =
22  PrologReasoner::getDefinedReasoner(t_manager, t_reasoner);
23  if (!definedReasoner) return null;
24  auto prologReasoner =
25  std::dynamic_pointer_cast<PrologReasoner>(definedReasoner->value());
26  return prologReasoner ? prologReasoner->reasonerManager().backendManager()->vocabulary()->importHierarchy() : null;
27 }
28 
29 static inline KnowledgeBase *getKnowledgeBase(term_t t_manager, term_t t_reasoner) {
30  auto definedReasoner =
31  PrologReasoner::getDefinedReasoner(t_manager, t_reasoner);
32  if (!definedReasoner) return nullptr;
33  return definedReasoner->value()->reasonerManager().kb();
34 }
35 
36 foreign_t sw_current_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph) {
37  auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
38 
39  char *graph;
40  if (hierarchy && PL_get_atom_chars(t_graph, &graph)) {
41  return hierarchy->isCurrentGraph(graph);
42  } else {
43  return false;
44  }
45 }
46 
47 foreign_t sw_set_current_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph) {
48  auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
49 
50  char *graph;
51  if (hierarchy && PL_get_atom_chars(t_graph, &graph)) {
52  hierarchy->addCurrentGraph(graph);
53  return true;
54  } else {
55  return false;
56  }
57 }
58 
59 foreign_t sw_unset_current_graph3(term_t t_manager, term_t t_reasoner, term_t t_origin) {
60  auto kb = getKnowledgeBase(t_manager, t_reasoner);
61  if(!kb) return false;
62 
63  char *origin;
64  if (PL_get_atom_chars(t_origin, &origin)) {
65  return kb->removeAllWithOrigin(origin);
66  } else {
67  return false;
68  }
69 }
70 
71 foreign_t sw_graph_add_direct_import4(term_t t_manager, term_t t_reasoner, term_t t_importer, term_t t_imported) {
72  auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
73 
74  char *importer, *imported;
75  if (hierarchy &&
76  PL_get_atom_chars(t_importer, &importer) &&
77  PL_get_atom_chars(t_imported, &imported)) {
78  hierarchy->addDirectImport(importer, imported);
79  return true;
80  } else {
81  return false;
82  }
83 }
84 
85 foreign_t sw_graph_get_imports4(term_t t_manager, term_t t_reasoner, term_t t_importer, term_t t_importedList) {
86  auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
87  char *importer;
88  if (hierarchy && PL_get_atom_chars(t_importer, &importer)) {
89  PlTail l(t_importedList);
90  for (auto &x: hierarchy->getImports(importer))
91  l.append(x->name().c_str());
92  l.close();
93  return true;
94  }
95  return false;
96 }
97 
98 foreign_t sw_set_default_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph) {
99  auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
100  char *graph;
101  if (hierarchy && PL_get_atom_chars(t_graph, &graph)) {
102  hierarchy->setDefaultGraph(graph);
103  return true;
104  }
105  return false;
106 
107 }
108 
109 foreign_t sw_default_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph) {
110  auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
111  return hierarchy && PL_unify_atom_chars(t_graph, hierarchy->defaultGraph().c_str());
112 }
113 
114 foreign_t sw_origin_any1(term_t t_origin) {
115  return PL_unify_atom_chars(t_origin, ImportHierarchy::ORIGIN_ANY.data());
116 }
117 
118 foreign_t sw_origin_system1(term_t t_origin) {
119  return PL_unify_atom_chars(t_origin, ImportHierarchy::ORIGIN_SYSTEM.data());
120 }
121 
122 foreign_t sw_origin_session1(term_t t_origin) {
123  return PL_unify_atom_chars(t_origin, ImportHierarchy::ORIGIN_SESSION.data());
124 }
125 
126 foreign_t sw_origin_user1(term_t t_origin) {
127  return PL_unify_atom_chars(t_origin, ImportHierarchy::ORIGIN_USER.data());
128 }
129 
130 foreign_t sw_origin_reasoner1(term_t t_origin) {
131  return PL_unify_atom_chars(t_origin, ImportHierarchy::ORIGIN_REASONER.data());
132 }
133 
134 foreign_t sw_origin_test1(term_t t_origin) {
135  return PL_unify_atom_chars(t_origin, ImportHierarchy::ORIGIN_TEST.data());
136 }
137 
138 foreign_t sw_url_graph2(term_t t_url, term_t t_graph) {
139  char *url;
140  if (PL_get_atom_chars(t_url, &url)) {
141  auto name = DataSource::getNameFromURI(url);
142  return PL_unify_atom_chars(t_graph, name.c_str());
143  }
144  return false;
145 }
146 
147 foreign_t sw_url_version2(term_t t_url, term_t t_version) {
148  char *url;
149  if (PL_get_atom_chars(t_url, &url)) {
150  auto version = DataSource::getVersionFromURI(url);
151  return PL_unify_atom_chars(t_version, version.c_str());
152  }
153  return false;
154 }
155 
156 foreign_t sw_load_rdf_xml4(term_t t_manager, term_t t_reasoner, term_t t_url, term_t t_parentGraph) {
157  auto kb = getKnowledgeBase(t_manager, t_reasoner);
158  char *url, *parentGraph;
159  if (kb && PL_get_atom_chars(t_url, &url) && PL_get_atom_chars(t_parentGraph, &parentGraph)) {
160  URI ontologyURI(url);
161  auto ontologyFile = std::make_shared<OntologyFile>(kb->vocabulary(), ontologyURI, "rdf-xml");
162  ontologyFile->setParentOrigin(parentGraph);
163  if (kb->loadDataSource(ontologyFile)) {
164  return true;
165  }
166  }
167  return false;
168 }
169 
170 foreign_t sw_assert6(term_t t_manager, term_t t_reasoner, term_t t_subject, term_t t_predicate, term_t t_object, term_t t_graph) {
171  auto kb = getKnowledgeBase(t_manager, t_reasoner);
172  if (!kb) return false;
173  auto s = PrologTerm::toKnowRobTerm(t_subject);
174  auto p = PrologTerm::toKnowRobTerm(t_predicate);
175  auto o = PrologTerm::toKnowRobTerm(t_object);
176  if (!s || !p || !o) return false;
177  TripleView tripleData;
178  tripleData.setSubject(((Atomic *) s.get())->stringForm());
179  tripleData.setPredicate(((Atomic *) p.get())->stringForm());
180  if(o->termType() == TermType::ATOMIC) {
181  auto atomic = std::static_pointer_cast<Atomic>(o);
182  if (atomic->isNumeric()) {
183  tripleData.setXSDValue(atomic->stringForm(),
184  std::static_pointer_cast<Numeric>(atomic)->xsdType());
185  } else if (atomic->isIRI()) {
186  tripleData.setObjectIRI(atomic->stringForm());
187  } else if (atomic->isBlank()) {
188  tripleData.setObjectBlank(atomic->stringForm());
189  } else {
190  tripleData.setStringValue(atomic->stringForm());
191  }
192  } else {
193  return false;
194  }
195  auto g = PrologTerm::toKnowRobTerm(t_graph);
196  if (g && g->termType() == TermType::ATOMIC) {
197  tripleData.setGraph(((Atomic *) g.get())->stringForm());
198  }
199  return kb->insertOne(tripleData);
200 }
201 
202 foreign_t sw_retract6(term_t t_manager, term_t t_reasoner, term_t t_subject, term_t t_predicate, term_t t_object, term_t t_graph) {
203  auto kb = getKnowledgeBase(t_manager, t_reasoner);
204  if (!kb) return false;
205  auto s = PrologTerm::toKnowRobTerm(t_subject);
206  auto p = PrologTerm::toKnowRobTerm(t_predicate);
207  auto o = PrologTerm::toKnowRobTerm(t_object);
208  if (!s || !p || !o) return false;
209  TripleView tripleData;
210  tripleData.setSubject(((Atomic *) s.get())->stringForm());
211  tripleData.setPredicate(((Atomic *) p.get())->stringForm());
212  if(o->termType() == TermType::ATOMIC) {
213  auto atomic = std::static_pointer_cast<Atomic>(o);
214  if (atomic->isNumeric()) {
215  tripleData.setXSDValue(atomic->stringForm(),
216  std::static_pointer_cast<Numeric>(atomic)->xsdType());
217  } else if (atomic->isIRI()) {
218  tripleData.setObjectIRI(atomic->stringForm());
219  } else if (atomic->isBlank()) {
220  tripleData.setObjectBlank(atomic->stringForm());
221  } else {
222  tripleData.setStringValue(atomic->stringForm());
223  }
224  } else {
225  return false;
226  }
227  auto g = PrologTerm::toKnowRobTerm(t_graph);
228  if (g && g->termType() == TermType::ATOMIC) {
229  tripleData.setGraph(((Atomic *) g.get())->stringForm());
230  }
231  return kb->removeOne(tripleData);
232 }
233 
234 namespace knowrob::prolog {
235  PL_extension PL_extension_semweb[] = {
236  {"sw_url_graph", 2, (pl_function_t) sw_url_graph2, 0},
237  {"sw_url_version", 2, (pl_function_t) sw_url_version2, 0},
238  {"sw_default_graph_cpp", 3, (pl_function_t) sw_default_graph3, 0},
239  {"sw_origin_any", 1, (pl_function_t) sw_origin_any1, 0},
240  {"sw_origin_system", 1, (pl_function_t) sw_origin_system1, 0},
241  {"sw_origin_session", 1, (pl_function_t) sw_origin_session1, 0},
242  {"sw_origin_user", 1, (pl_function_t) sw_origin_user1, 0},
243  {"sw_origin_reasoner", 1, (pl_function_t) sw_origin_reasoner1, 0},
244  {"sw_origin_test", 1, (pl_function_t) sw_origin_test1, 0},
245  {"sw_set_default_graph_cpp", 3, (pl_function_t) sw_set_default_graph3, 0},
246  {"sw_graph_get_imports_cpp", 4, (pl_function_t) sw_graph_get_imports4, 0},
247  {"sw_graph_add_direct_import_cpp", 4, (pl_function_t) sw_graph_add_direct_import4, 0},
248  {"sw_current_graph_cpp", 3, (pl_function_t) sw_current_graph3, 0},
249  {"sw_set_current_graph_cpp", 3, (pl_function_t) sw_set_current_graph3, 0},
250  {"sw_unset_current_graph_cpp", 3, (pl_function_t) sw_unset_current_graph3, 0},
251  {"sw_load_rdf_xml_cpp", 4, (pl_function_t) sw_load_rdf_xml4, 0},
252  {"sw_assert_cpp", 6, (pl_function_t) sw_assert6, 0},
253  {"sw_retract_cpp", 6, (pl_function_t) sw_retract6, 0},
254  {nullptr, 0, nullptr, 0}
255  };
256 }
static std::string getNameFromURI(const std::string &uriString)
Definition: DataSource.cpp:36
static std::string getVersionFromURI(const std::string &uriString)
Definition: DataSource.cpp:48
static constexpr std::string_view ORIGIN_TEST
static constexpr std::string_view ORIGIN_SESSION
static constexpr std::string_view ORIGIN_USER
static constexpr std::string_view ORIGIN_REASONER
static constexpr std::string_view ORIGIN_SYSTEM
static constexpr std::string_view ORIGIN_ANY
static std::shared_ptr< NamedReasoner > getDefinedReasoner(const term_t &t_reasonerManager, const term_t &t_reasonerModule)
TermPtr toKnowRobTerm() const
Definition: PrologTerm.cpp:691
void setXSDValue(std::string_view v, XSDType type)
Definition: Triple.cpp:32
void setStringValue(std::string_view v) override
Definition: Triple.h:464
void setObjectIRI(std::string_view object) override
Definition: Triple.h:452
void setPredicate(std::string_view predicate) override
Definition: Triple.h:449
void setObjectBlank(std::string_view identifier) override
Definition: Triple.h:461
void setGraph(std::string_view graph) override
Definition: Triple.h:497
void setSubject(std::string_view subject) override
Definition: Triple.h:446
TermRule & atomic()
Definition: terms.cpp:79
PL_extension PL_extension_semweb[]
Definition: semweb.h:12
foreign_t sw_load_rdf_xml4(term_t t_manager, term_t t_reasoner, term_t t_url, term_t t_parentGraph)
Definition: semweb.cpp:156
foreign_t sw_origin_any1(term_t t_origin)
Definition: semweb.cpp:114
foreign_t sw_url_version2(term_t t_url, term_t t_version)
Definition: semweb.cpp:147
foreign_t sw_url_graph2(term_t t_url, term_t t_graph)
Definition: semweb.cpp:138
foreign_t sw_origin_reasoner1(term_t t_origin)
Definition: semweb.cpp:130
foreign_t sw_current_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph)
Definition: semweb.cpp:36
foreign_t sw_origin_system1(term_t t_origin)
Definition: semweb.cpp:118
foreign_t sw_retract6(term_t t_manager, term_t t_reasoner, term_t t_subject, term_t t_predicate, term_t t_object, term_t t_graph)
Definition: semweb.cpp:202
foreign_t sw_graph_add_direct_import4(term_t t_manager, term_t t_reasoner, term_t t_importer, term_t t_imported)
Definition: semweb.cpp:71
foreign_t sw_set_default_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph)
Definition: semweb.cpp:98
foreign_t sw_graph_get_imports4(term_t t_manager, term_t t_reasoner, term_t t_importer, term_t t_importedList)
Definition: semweb.cpp:85
foreign_t sw_unset_current_graph3(term_t t_manager, term_t t_reasoner, term_t t_origin)
Definition: semweb.cpp:59
foreign_t sw_origin_user1(term_t t_origin)
Definition: semweb.cpp:126
foreign_t sw_assert6(term_t t_manager, term_t t_reasoner, term_t t_subject, term_t t_predicate, term_t t_object, term_t t_graph)
Definition: semweb.cpp:170
foreign_t sw_origin_session1(term_t t_origin)
Definition: semweb.cpp:122
foreign_t sw_default_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph)
Definition: semweb.cpp:109
foreign_t sw_set_current_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph)
Definition: semweb.cpp:47
foreign_t sw_origin_test1(term_t t_origin)
Definition: semweb.cpp:134