6 #define PL_SAFE_ARG_MACROS
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"
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 =
23 if (!definedReasoner)
return null;
25 std::dynamic_pointer_cast<PrologReasoner>(definedReasoner->value());
26 return prologReasoner ? prologReasoner->reasonerManager().backendManager()->vocabulary()->importHierarchy() :
null;
29 static inline KnowledgeBase *getKnowledgeBase(term_t t_manager, term_t t_reasoner) {
30 auto definedReasoner =
32 if (!definedReasoner)
return nullptr;
33 return definedReasoner->value()->reasonerManager().kb();
37 auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
40 if (hierarchy && PL_get_atom_chars(t_graph, &graph)) {
41 return hierarchy->isCurrentGraph(graph);
48 auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
51 if (hierarchy && PL_get_atom_chars(t_graph, &graph)) {
52 hierarchy->addCurrentGraph(graph);
60 auto kb = getKnowledgeBase(t_manager, t_reasoner);
64 if (PL_get_atom_chars(t_origin, &origin)) {
65 return kb->removeAllWithOrigin(origin);
72 auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
74 char *importer, *imported;
76 PL_get_atom_chars(t_importer, &importer) &&
77 PL_get_atom_chars(t_imported, &imported)) {
78 hierarchy->addDirectImport(importer, imported);
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);
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());
99 auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
101 if (hierarchy && PL_get_atom_chars(t_graph, &graph)) {
102 hierarchy->setDefaultGraph(graph);
110 auto hierarchy = getImportHierarchy(t_manager, t_reasoner);
111 return hierarchy && PL_unify_atom_chars(t_graph, hierarchy->defaultGraph().c_str());
140 if (PL_get_atom_chars(t_url, &url)) {
142 return PL_unify_atom_chars(t_graph, name.c_str());
149 if (PL_get_atom_chars(t_url, &url)) {
151 return PL_unify_atom_chars(t_version, version.c_str());
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)) {
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;
176 if (!s || !p || !o)
return false;
181 auto atomic = std::static_pointer_cast<Atomic>(o);
182 if (
atomic->isNumeric()) {
184 std::static_pointer_cast<Numeric>(
atomic)->xsdType());
185 }
else if (
atomic->isIRI()) {
187 }
else if (
atomic->isBlank()) {
199 return kb->insertOne(tripleData);
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;
208 if (!s || !p || !o)
return false;
213 auto atomic = std::static_pointer_cast<Atomic>(o);
214 if (
atomic->isNumeric()) {
216 std::static_pointer_cast<Numeric>(
atomic)->xsdType());
217 }
else if (
atomic->isIRI()) {
219 }
else if (
atomic->isBlank()) {
231 return kb->removeOne(tripleData);
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}
static std::string getNameFromURI(const std::string &uriString)
static std::string getVersionFromURI(const std::string &uriString)
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
void setXSDValue(std::string_view v, XSDType type)
void setStringValue(std::string_view v) override
void setObjectIRI(std::string_view object) override
void setPredicate(std::string_view predicate) override
void setObjectBlank(std::string_view identifier) override
void setGraph(std::string_view graph) override
void setSubject(std::string_view subject) override
PL_extension PL_extension_semweb[]
foreign_t sw_load_rdf_xml4(term_t t_manager, term_t t_reasoner, term_t t_url, term_t t_parentGraph)
foreign_t sw_origin_any1(term_t t_origin)
foreign_t sw_url_version2(term_t t_url, term_t t_version)
foreign_t sw_url_graph2(term_t t_url, term_t t_graph)
foreign_t sw_origin_reasoner1(term_t t_origin)
foreign_t sw_current_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph)
foreign_t sw_origin_system1(term_t t_origin)
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)
foreign_t sw_graph_add_direct_import4(term_t t_manager, term_t t_reasoner, term_t t_importer, term_t t_imported)
foreign_t sw_set_default_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph)
foreign_t sw_graph_get_imports4(term_t t_manager, term_t t_reasoner, term_t t_importer, term_t t_importedList)
foreign_t sw_unset_current_graph3(term_t t_manager, term_t t_reasoner, term_t t_origin)
foreign_t sw_origin_user1(term_t t_origin)
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)
foreign_t sw_origin_session1(term_t t_origin)
foreign_t sw_default_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph)
foreign_t sw_set_current_graph3(term_t t_manager, term_t t_reasoner, term_t t_graph)
foreign_t sw_origin_test1(term_t t_origin)