static SerdStatus write_statement(SordModel* sord, SerdWriter* writer, SordQuad tup, SerdStatementFlags flags) { const SordNode* s = tup[SORD_SUBJECT]; const SordNode* p = tup[SORD_PREDICATE]; const SordNode* o = tup[SORD_OBJECT]; const SordNode* d = sord_node_get_datatype(o); const SerdNode* ss = sord_node_to_serd_node(s); const SerdNode* sp = sord_node_to_serd_node(p); const SerdNode* so = sord_node_to_serd_node(o); const SerdNode* sd = sord_node_to_serd_node(d); const char* lang_str = sord_node_get_language(o); size_t lang_len = lang_str ? strlen(lang_str) : 0; SerdNode language = SERD_NODE_NULL; if (lang_str) { language.type = SERD_LITERAL; language.n_bytes = lang_len; language.n_chars = lang_len; language.buf = (const uint8_t*)lang_str; }; // TODO: Subject abbreviation if (sord_node_is_inline_object(s) && !(flags & SERD_ANON_CONT)) { return SERD_SUCCESS; } SerdStatus st = SERD_SUCCESS; if (sord_node_is_inline_object(o)) { SordQuad sub_pat = { o, 0, 0, 0 }; SordIter* sub_iter = sord_find(sord, sub_pat); SerdStatementFlags start_flags = flags | ((sub_iter) ? SERD_ANON_O_BEGIN : SERD_EMPTY_O); st = serd_writer_write_statement( writer, start_flags, NULL, ss, sp, so, sd, &language); if (!st && sub_iter) { flags |= SERD_ANON_CONT; for (; !st && !sord_iter_end(sub_iter); sord_iter_next(sub_iter)) { SordQuad sub_tup; sord_iter_get(sub_iter, sub_tup); st = write_statement(sord, writer, sub_tup, flags); } sord_iter_free(sub_iter); serd_writer_end_anon(writer, so); } } else { st = serd_writer_write_statement( writer, flags, NULL, ss, sp, so, sd, &language); } return st; }
bool sord_contains(SordModel* sord, const SordQuad pat) { SordIter* iter = sord_find(sord, pat); bool ret = (iter != NULL); sord_iter_free(iter); return ret; }
bool sord_write(SordModel* model, SerdWriter* writer, SordNode* graph) { SordQuad pat = { 0, 0, 0, graph }; SordIter* iter = sord_find(model, pat); return sord_write_iter(iter, writer); }
SordIter* sord_search(SordModel* model, const SordNode* s, const SordNode* p, const SordNode* o, const SordNode* g) { SordQuad pat = { s, p, o, g }; return sord_find(model, pat); }