- From: Jonas Liljegren <jonas@rit.se>
- Date: 22 Oct 2000 15:00:32 +0200
- To: RDF interest group <www-rdf-interest@w3.org>, rdf@uxn.nu, masters@rit.se
This is a sort of tutorial introduction to Wraf, alpha 2. The website
http://www.uxn.nu/wraf/ will soon have a (silly) online demo of the
module.
Next on the list are the server functionality, so that the program
doesn't have to start up for every call.
-----------------------------------------------------
# The RDF::Service library requires perl v5.6
#
use 5.006;
# Set the path to the library
#
use FindBin; use lib "$FindBin::Bin/../lib";
# Load the library
#
use RDF::Service;
# Constants used
#
use RDF::Service::Constants qw( NS_L );
# Create the session object.
#
# There is a diffrence between
#
# 1) the RDF::Service module,
#
# 2) the RDF::Service distribution package,
#
# 3) the RDF::Service installation,
#
# 4) the running (server) instance of RDF::Service and
#
# 5) the connection to the RDF::Service server.
#
# Our $s is a resouce object representing our *connection* to the
# RDF::Service server. That's why I call it a session resource.
our $s = new RDF::Service( NS_L."/session/S1" );
# The URI will be diffrent between diffrent clients and times. A
# continued session should use the same session URI. The parameter to
# the constructor holds our session URI.
#
# The URI string used as parameter for the constructor are here
# constructed by concatenating the constant NS_L with a string. NS_L
# stands for "Namespace local" and is here the namespace owned by the
# running instance ot the RDF::Service server.
#
# The $s object holds information about the connected interfaces.
# The interfaces are the modules that provides read and write access
# to RDF statements.
#
# The constructor starts out by connecting to the base interface -
# RDF::Service::Interface::Base::V01 - implementing the most basic
# functions.
# We continue by connecting to the RDFS interface.
#
# The interface gives you access to the RDF, RDFS and L (local)
# schemas. (This interface will probably be devided into three
# separate interfaces in a later version.)
#
# The statements in the schema are hard coded into the module.
# Nothing can be stored here. This interface implements the class
# inheritance that belongs to the RDFS schema. It says that if a
# resource is of type A and A is a subClassOf B, then it will add that
# the resource also is of type B.
$s->connect("RDF::Service::Interface::Schema::RDFS_200001");
# The module embeds the schema version date in its name. (We will be
# using the URI of the interface in later versions.) Each session
# can connect to diffrent interfaces and diffrent versions of
# interfaces. This means that the same question will give diffrent
# answers, depending on what interfaces the session has connected to.
#
# The $s object is not actually a resource object, but a *context*
# object. All objects from the client perspective are context
# objects. They in turn holds the actual resource object and the
# context. The context will be used to refere to the session and the
# local context in which the object was retrieved.
# We will now connect to a database, used to store our localy created
# statements. Statements private to the session are not stored
# anywhere and will dissapere then the program ends.
our $db = $s->connect("RDF::Service::Interface::DBI::V01",
{
connect => "dbi:Pg:dbname=wraf_v01a",
name => "wwwdata",
password => "secret",
});
# The named parameters here represents the properties of the
# database. The same interface can be used to connect to several
# diffrent databases (or even the same databse, but with diffrent
# authorizations).
#
# The interface object returned represents the *connection* to the
# interface. The URI of the interface connection will be constructed
# from the interface module URI and all the parameters except the
# password. If another session uses the same interface module and the
# same parameters, they will get the same interface connection resouce
# object. (But placed in their own context.)
# And now create a model in which our statements will be placed. (The
# session statements is placed in a server meta-model.)
my $model = $s->get_model(NS_L.'/model/M1');
# get_model() is a combination of a couple of other methods. It will
# find the resource with the specified URI. If that resource is not a
# model, it will fail. If the resource doesn't exist, it will be
# created as a model.
#
# Statements (arcs) will be saved in the first interface that accepts
# them. In this case, it would be the DB interface. Later version
# could use $db->get_model() in order to explicitly state the
# interface used for saving the arcs.
# Define a new class. $c_person stands for "the class named Person".
my $c_person = $s->get(NS_L.'/Class/Person')->set($model, [NS_RDFS,'Class']);
# get() retrieves the existing resource. If non can be find, it
# creates a new one. On the other hand; find() will fail no arc
# mentioning the resource can be found. (Will use the current
# selection (calling object), rather than allways look in all
# connected interfaces.
#
# The set() can be called with $node->set($model, $types, $props).
# $types i a list of types for the $node and $props holds any
# properties (in the form name/vale pairs) to set. All the created
# arcs will be placed in $model. (Later versions will take $model
# from the calling context instead.)
#
# The set() method sets *all* properties for the $node in the $model.
# Any existing statements about the node in the same model will be
# removed.
#
# (Future versions will check that you (the session agent) own the
# model you are using and that the model is open. Closed models can
# never be changed.)
# Create a person with first and last name.
$s->get()->set($model, [$c_person],
{
NS_L.'/Property/first_name' => ["Jonas"],
NS_L.'/Property/last_name' => ["Liljegren"],
}
);
# The empty get() generates a unique URI. The types list consists of
# the person class and the property list defines the first and last
# name. Each value in the name/value list is a reference to a list of
# resource objects. If a element is a string (as in this example), a
# literal resouce will be created with a unique URI. All this will be
# placed in the provided $model and stored in the $db interface.
# Get a list of all resources of type Person.
my @persons = $c_person->rev_type->list;
# rev_type() is the reverse of type(). type() returns a
# selection of all the types for a node. rev_type() returns all nodes
# that has type of the calling node.
#
# A selection is a special type of resource that represents all
# resources matching the specified criterions. Those criterions can
# (in later versions) be arbitrary complex. New criterions can
# (later) be added to existing selections. Some criterions can be set
# up for the session and get inherited to the context of the calling
# node.
#
# The criterions doesn't have to be resolved until you actually want
# to iterate through the members of the selection. Later versions
# will dynamicly create indexes for common criterions and optimize the
# retrieval.
# Get the first name of the first person.
my $first_name = $persons[0]->arc_obj(NS_L.'/Property/first_name')->li;
print ${ $first_name->value };
# arc_obj($pred) is a shorthand for arc($pred)->obj() which in turn is
# a shorthand for arc({ pred => $pred })->obj(). They return a
# selection of matched resources.
#
# The li() method assumes that the selection only has one resource.
# Any more or less and the method throws an exception. li() will also
# be used to retrieve a specified from a selection, based on the list
# number or extra criterions.
#
# value() expects the calling node to be a literal and returns a
# reference to the literal value. References are used to prevent
# copying in case of very large (maby binary) literals.
# Change the name of the person.
$first_name->set_literal($model, \"James");
# Remove the person (recurseivly).
$person[0]->delete( $model );
# This deletes all statements with person 0 as subject, and does the
# same for each object of those statements. But only statements
# beloning to the $model.
# That's all. There are other moethods/properties. But you have to
# read the source to find them. ;-)
--
/ Jonas Liljegren
The Wraf project http://www.uxn.nu/wraf/
Sponsored by http://www.rit.se/
Received on Sunday, 22 October 2000 08:59:32 UTC