Open Source Content Management Framework

RDF use-case

  1. RDF use-case

    Tue August 31 2010 09:55:08 UTC
    So, let's see if we can use current API for real-world stuff.
    vala-code in sections below doesn't need to be complete application. just pieces of relevant code would be enough.
    Let's keep it simple

    I will answer with code myself too.

    So, here we go:

    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    1. Here, I define desired data-structure as a YAML file (looks a bit easier than usual RDF ontologies)

    ---
    namespaces:
    -
    uri: http://purl.org/dc/elements/1.1/
    alias: dc
    -
    uri: http://example.com/client/
    alias: client

    properties:
    -
    uri: http://purl.org/dc/elements/1.1/title
    db_type: text # can be varchar(1024) for sql
    -
    uri: http://purl.org/dc/elements/1.1/date
    db_type: datetime
    -
    uri: http://purl.org/dc/elements/1.1/language
    db_type: text # can be varchar(50) for sql
    -
    uri: http://example.com/client/book
    db_type: uuid # reference to book. can be char(32) or binary(16) for sql

    classes:
    -
    uri: http://example.com/client/book
    fields:
    - http://purl.org/dc/elements/1.1/title
    - http://purl.org/dc/elements/1.1/date
    - http://purl.org/dc/elements/1.1/language

    -
    uri: http://example.com/client/movie
    fields:
    - http://purl.org/dc/elements/1.1/title
    - http://purl.org/dc/elements/1.1/date
    - http://purl.org/dc/elements/1.1/language
    - http://example.com/client/book
    ...


    2. Vala code, for defining namespaces

    (place email-replies here)


    3. Vala code for defining properties

    (place email-replies here)


    4. Vala code for defining classes

    (place email-replies here)


    5. Vala code for creating objects of defined classes

    (place email-replies here)


    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-




    _______________________________________________
    dev mailing list
    dev@lists.midgard-project.org
    http://lists.midgard-project.org/mailman/listinfo/dev
    •  Reply
  2. Re: [midgard-dev] RDF use-case

    Tue August 31 2010 10:55:07 UTC
    On 31.08.2010, at 13:49, Alexey Zakhlestin wrote:

    > 2. Vala code, for defining namespaces

    var nm = new NamespaceManager; // should it be singleton?

    nm.create_uri('http://purl.org/dc/elements/1.1/', 'dc');
    nm.create_uri('http://example.com/client/', 'client');


    > 3. Vala code for defining properties

    var dc_title = new SchemaModelProperty();
    dc_title.namespace = 'dc';
    dc_title.name = 'title';
    dc_title.value_gtype = gchararray;

    var dc_date = new SchemaModelProperty();
    dc_date.namespace = 'dc';
    dc_date.name = 'date';
    dc_date.value_gtype = GDateTime; // from http://github.com/chergert/gdatetime

    var dc_language = new SchemaModelProperty();
    dc_language.namespace = 'dc';
    dc_language.name = 'language';
    dc_language.value_gtype = gchararray;

    var client_book = new SchemaModelProperty();
    client_book.namespace = 'client';
    client_book.name = 'book';
    client_book.value_gtype = ClientBook; // we'll need to define this beforehand

    // ====================================================================
    // We need means to store properties definitions at this point without
    // attaching them to classes
    // ====================================================================


    > 4. Vala code for defining classes

    // http://example.com/client/book
    var book_model = new SchemaModel();
    book_model.namespace = 'client';
    book_model.name = 'book';

    book_model
    .add_model(dc_title)
    .add_model(dc_date)
    .add_model(dc_language);

    // http://example.com/client/movie
    var movie_model = new SchemaModel();
    movie_model.namespace = 'client';
    movie_model.name = 'movie';

    movie_model
    .add_model(dc_title)
    .add_model(dc_date)
    .add_model(dc_language)
    .add_model(client_book);

    // register in type-system
    var builder = new SchemaBuilder();
    builder.register_model(book_model);
    builder.register_model(movie_model);
    builder.execute();

    > 5. Vala code for creating objects of defined classes

    var book = SchemaBuilder.factory("http://example.com/client/book") as SchemaObject;
    book.set_property_value('dc:title', 'Do Androids Dream of Electric Sheep?');
    book.set_property_value('dc:date', '1968');
    book.set_property_value('dc:language', 'en_EN');

    var movie = SchemaBuilder.factory("http://example.com/client/movie") as SchemaObject;
    movie.set_property_value('dc:title', 'Blade_Runner');
    movie.set_property_value('dc:date', '1982-06-25');
    movie.set_property_value('dc:language', 'en_EN');
    movie.set_property_value('client:book', book);

    _______________________________________________
    dev mailing list
    dev@lists.midgard-project.org
    http://lists.midgard-project.org/mailman/listinfo/dev
    •  Reply
  3. Re: [midgard-dev] RDF use-case

    Tue August 31 2010 10:55:10 UTC
    > namespaces:
    > -
    > uri: http://purl.org/dc/elements/1.1/
    > alias: dc
    > -
    > uri: http://example.com/client/
    > alias: client
    >
    > properties:
    > -
    > uri: http://purl.org/dc/elements/1.1/title
    > db_type: text # can be varchar(1024) for sql
    > -
    > uri: http://purl.org/dc/elements/1.1/date
    > db_type: datetime
    > -
    > uri: http://purl.org/dc/elements/1.1/language
    > db_type: text # can be varchar(50) for sql
    > -
    > uri: http://example.com/client/book
    > db_type: uuid # reference to book. can be char(32) or binary(16) for sql
    >
    > classes:
    > -
    > uri: http://example.com/client/book
    > fields:
    > - http://purl.org/dc/elements/1.1/title
    > - http://purl.org/dc/elements/1.1/date
    > - http://purl.org/dc/elements/1.1/language
    >
    > -
    > uri: http://example.com/client/movie
    > fields:
    > - http://purl.org/dc/elements/1.1/title
    > - http://purl.org/dc/elements/1.1/date
    > - http://purl.org/dc/elements/1.1/language
    > - http://example.com/client/book
    > ...
    >
    >
    > 2. Vala code, for defining namespaces

    With NamespaceManager in *current* shape:

    NamespaceManager nsm = NamespaceManager ();
    nsm.create_uri ("http://purl.org/dc/elements/1.1/", "dc");
    nsm.create_uri ("http://example.com/client/", "client");
    nsm.create_uri ("uri: http://purl.org/dc/elements/1.1/title", "title");

    Latter case clearly shows there's additional reference needed.

    > 3. Vala code for defining properties
    >

    SchemaModelProperty title_p = SchemaModelProperty ("title", "string",
    "", "The title");
    SchemaModelProperty date_p = SchemaModelProperty ("date", "datetime",
    "0000-01-01 00:00:00", "Date");
    SchemaModelProperty language_p = SchemaModelProperty ("language",
    "string", "", "Languge");

    > 4. Vala code for defining classes

    SchemaModel book_model = SchemaModel ("Book");
    SchemaModel movie_model = SchemaModel ("Movie");

    book_model.add_model (title_p).add_model (date_p).add_model (language_p);

    movie_model.add_model(title_p).add_model (date_p).add_model
    (language_p).add_model (book_model);

    SchemaBuilder schema_builder = SchemaBuilder ();

    try {
    schema_builder.register_model (book_model);
    schema_builder.register_model (movie_model);
    schema_builder.execute ();
    } catch () { }

    >
    > 5. Vala code for creating objects of defined classes

    StorageModelManager model_manager = storage.get_model_manager();

    StorageModel book_storage_model = model_manager.create_storage_model
    (book_model, "books_table");
    StorageModel movie_storage_model = model_manager.create_storage_model
    (movie_model, "movies_table");

    StorageModelProperty title_storage = StorageModelProperty (title_p,
    "title_field");
    StorageModelProperty date_storage = StorageModelProperty (date_p,
    "date_field");
    StorageModelProperty lang_storage = StorageModelProperty (language_p,
    "lang_field");

    book_storage_model.add_model (title_storage).add_model
    (date_storage).add_model (lang_storage);

    StorageModelProperty book_storage = StorageModelProperty (book_model,
    "book_field");

    movie_storage_model.add_model (title_storage).add_model
    (date_storage).add_model (lang_storage).add_model (book_storage);

    model_manager.add_model (book_storage_model).add_model
    (book_model).add_model (movie_storage_model).add_model (movie_model);

    try {
    model_manager.prepare_create ();
    model_manager.execute ();
    } catch () {}

    SchemaObject book = schema_builder.factory ("Book");
    book.set_property_value ("http://purl.org/dc/elements/1.1/title", "The
    true story of the movie");

    ContentManager cm = storage.get_content_manager();
    cm.create (book);

    SchemaObject movie = schema_builder.factory ("Movie");
    book.set_property_value ("http://purl.org/dc/elements/1.1/title", "The
    great movie");
    book.set_property_value ("http://example.com/client/book", book);

    cm.create (movie);

    Piotras
    _______________________________________________
    dev mailing list
    dev@lists.midgard-project.org
    http://lists.midgard-project.org/mailman/listinfo/dev
    •  Reply
  4. Re: [midgard-dev] RDF use-case

    Tue August 31 2010 11:15:05 UTC
    >> 2. Vala code, for defining namespaces
    >
    > var nm = new NamespaceManager; // should it be singleton?

    Yes. If we associate it with StorageManager:

    * singleton
    * lazy initialization

    >> 3. Vala code for defining properties
    >
    > dc_title.name = 'title';
    > dc_title.value_gtype = gchararray;

    I added typename and g_type.
    For typename, you can declare just 'string' which is common in every
    language, while gchararray is GType system specific.
    g_type let us tune schema vs storage models creation. For example
    datetime values which must be string ones in some DBMS.

    > // ====================================================================
    > // We need means to store properties definitions at this point without
    > // attaching them to classes
    > // ====================================================================

    Proposal?

    >
    >> 4. Vala code for defining classes
    >
    > // http://example.com/client/book
    > var book_model = new SchemaModel();
    > book_model.namespace = 'client';

    If class namespace is needed, please update Model interface.

    Piotras
    _______________________________________________
    dev mailing list
    dev@lists.midgard-project.org
    http://lists.midgard-project.org/mailman/listinfo/dev
    •  Reply
  5. Re: [midgard-dev] RDF use-case

    Tue August 31 2010 12:05:07 UTC
    On 31.08.2010, at 15:09, Piotr Pokora wrote:

    >>> 2. Vala code, for defining namespaces
    >>
    >> var nm = new NamespaceManager; // should it be singleton?
    >
    > Yes. If we associate it with StorageManager:
    >
    > * singleton
    > * lazy initialization

    wellÂ… the problem is, that NamespaceManager is not a property of storage
    though, NamespaceManager can (should?) use StorageManager as the backend

    Maybe it should be associated with ModelManager, instead?:

    var storage = new StorageManager(new Config());
    storage.open();

    var nm = storage.model_manager.namespace_manager;

    >
    >>> 3. Vala code for defining properties
    >>
    >> dc_title.name = 'title';
    >> dc_title.value_gtype = gchararray;
    >
    > I added typename and g_type.
    > For typename, you can declare just 'string' which is common in every
    > language, while gchararray is GType system specific.
    > g_type let us tune schema vs storage models creation. For example
    > datetime values which must be string ones in some DBMS.

    ok. will post updated vala-example in a moment


    >>> 4. Vala code for defining classes
    >>
    >> // http://example.com/client/book
    >> var book_model = new SchemaModel();
    >> book_model.namespace = 'client';
    >
    > If class namespace is needed, please update Model interface.

    done



    _______________________________________________
    dev mailing list
    dev@lists.midgard-project.org
    http://lists.midgard-project.org/mailman/listinfo/dev
    •  Reply
  6. Re: [midgard-dev] RDF use-case

    Tue August 31 2010 12:30:06 UTC
    [[ 2-nd edition ]]

    2. Vala code, for defining namespaces

    var storage = new StorageManager(new Config());
    storage.open();

    var nm = storage.model_manager.namespace_manager;

    nm.create_uri('http://purl.org/dc/elements/1.1/', 'dc');
    nm.create_uri('http://example.com/client/', 'client');


    3. Vala code for defining properties

    var dc_title = new SchemaModelProperty();
    dc_title.namespace = 'dc';
    dc_title.name = 'title';
    dc_title.value_typename = 'string';

    var dc_date = new SchemaModelProperty();
    dc_date.namespace = 'dc';
    dc_date.name = 'date';
    dc_date.value_typename = 'DateTime'; // from http://github.com/chergert/gdatetime

    var dc_language = new SchemaModelProperty();
    dc_language.namespace = 'dc';
    dc_language.name = 'language';
    dc_language.value_typename = 'string';

    var client_book = new SchemaModelProperty();
    client_book.namespace = 'client';
    client_book.name = 'book';
    client_book.value_typename = 'client:book'; // we'll need to define this beforehand

    // ====================================================================
    // We need means to store properties definitions at this point without
    // attaching them to classes
    // ====================================================================


    4. Vala code for defining classes

    // http://example.com/client/book
    var book_model = new SchemaModel();
    book_model.namespace = 'client';
    book_model.name = 'book';

    book_model
    .add_model(dc_title)
    .add_model(dc_date)
    .add_model(dc_language);

    // http://example.com/client/movie
    var movie_model = new SchemaModel();
    movie_model.namespace = 'client';
    movie_model.name = 'movie';

    movie_model
    .add_model(dc_title)
    .add_model(dc_date)
    .add_model(dc_language)
    .add_model(client_book);

    // register in type-system
    var builder = new SchemaBuilder();
    builder.register_model(book_model);
    builder.register_model(movie_model);
    builder.execute();

    5. Vala code for creating objects of defined classes

    var book = SchemaBuilder.factory("http://example.com/client/book") as SchemaObject;
    book.set_property_value('dc:title', 'Do Androids Dream of Electric Sheep?');
    book.set_property_value('dc:date', '1968');
    book.set_property_value('dc:language', 'en_EN');

    var movie = SchemaBuilder.factory("http://example.com/client/movie") as SchemaObject;
    movie.set_property_value('dc:title', 'Blade_Runner');
    movie.set_property_value('dc:date', '1982-06-25');
    movie.set_property_value('dc:language', 'en_EN');
    movie.set_property_value('client:book', book);



    _______________________________________________
    dev mailing list
    dev@lists.midgard-project.org
    http://lists.midgard-project.org/mailman/listinfo/dev
    •  Reply
  7. Re: [midgard-dev] RDF use-case

    Tue August 31 2010 13:50:06 UTC
    >>> var nm = new NamespaceManager; // should it be singleton?
    >>
    >> Yes. If we associate it with StorageManager:
    >>
    >> * singleton
    >> * lazy initialization
    >
    > wellÂ… the problem is, that NamespaceManager is not a property of storage
    > though, NamespaceManager can (should?) use StorageManager as the backend
    >
    > Maybe it should be associated with ModelManager, instead?:
    >
    > var storage = new StorageManager(new Config());
    > storage.open();
    >
    > var nm = storage.model_manager.namespace_manager;

    Why it can not associated with StorageManager which creates all storage
    related classes? To be consistent with Query, Model, Transaction and
    Profiler, Namespace manager should be created with StorageManager.

    On the other hand, if we would like to ModelManager to create Namespace
    one, why do not make Namespace manager yet another model?

    Latter makes ModelManager implementation a bit difficult, and the first
    one forces us to clarify StorageManager family relations I mentioned few
    mails earlier.

    Piotras
    _______________________________________________
    dev mailing list
    dev@lists.midgard-project.org
    http://lists.midgard-project.org/mailman/listinfo/dev
    •  Reply
  8. Re: [midgard-dev] RDF use-case

    Tue August 31 2010 14:45:06 UTC
    On 31.08.2010, at 17:46, Piotr Pokora wrote:

    > Why it can not associated with StorageManager which creates all storage
    > related classes? To be consistent with Query, Model, Transaction and
    > Profiler, Namespace manager should be created with StorageManager.

    I don't like it either way.

    NamespaceManager is not related to StorageManager at all.
    NamespaceManager is the property of the whole runtime context and is active on the level of SchemaModels

    Application developer can use aliased property-names/class-names, but internally system operates using full namespaced names.
    And when queries are prepared for StorageManager these names are mapped to SQL field names or whatever current storage requires.

    So, we can have several StorageManagers but only one NamespaceManager.


    Now, that I think of it, other option is, to implement NamespaceManager on application level.
    It's quite easy to do and NamespaceManager doesn't provide any vital functionality. It is there only to make things easier for app-developers



    _______________________________________________
    dev mailing list
    dev@lists.midgard-project.org
    http://lists.midgard-project.org/mailman/listinfo/dev
    •  Reply
  9. Re: [midgard-dev] RDF use-case

    Tue August 31 2010 15:00:06 UTC
    > Application developer can use aliased property-names/class-names, but internally system operates using full namespaced names.
    > And when queries are prepared for StorageManager these names are mapped to SQL field names or whatever current storage requires.
    >
    > So, we can have several StorageManagers but only one NamespaceManager.

    Agree.

    > Now, that I think of it, other option is, to implement NamespaceManager on application level.
    > It's quite easy to do and NamespaceManager doesn't provide any vital functionality. It is there only to make things easier for app-developers

    It could be a wrapper for particular SchemaObject class.

    Piotras
    _______________________________________________
    dev mailing list
    dev@lists.midgard-project.org
    http://lists.midgard-project.org/mailman/listinfo/dev
    •  Reply
Designed by Nemein, hosted by Kafit