16.8.7.Virtuoso ODS to RDF

Linked Data View for ODS (the consolidated Graph)

SPARQL drop quad map virtrdf:ODS_DS . ;

SPARQL prefix ods: <http://www.openlinksw.com/virtuoso/ods/>
       create iri class ods:graph "http://^{URIQADefaultHost}^/dataspace/%U" (in uname varchar not null)
                            option (returns "http://^{URIQADefaultHost}^/dataspace/%U") .
       create iri class ods:user "http://^{URIQADefaultHost}^/dataspace/%U#user" (in uname varchar not null)
                            option (returns "http://^{URIQADefaultHost}^/dataspace/%U#user") .
       create iri class ods:user_group "http://^{URIQADefaultHost}^/dataspace/%U#group" (in uname varchar not null)
                            option (returns "http://^{URIQADefaultHost}^/dataspace/%U#group") .
       create iri class ods:person "http://^{URIQADefaultHost}^/dataspace/%U#this" (in uname varchar not null)
                            option (returns "http://^{URIQADefaultHost}^/dataspace/%U#this") .
       create iri class ods:mbox "mailto:%s" (in email varchar not null)
                            option (returns "mailto:%s") .
       create iri class ods:phone "tel:%s" (in tel varchar not null)
                            option (returns "tel:%s") .
       create iri class ods:geo_point "http://^{URIQADefaultHost}^/dataspace/%U#geo" (in uname varchar not null)
                            option (returns "http://^{URIQADefaultHost}^/dataspace/%U#geo") .
       create iri class ods:forum "http://^{URIQADefaultHost}^/dataspace/%U/%U/%U"
            ( in uname varchar not null, in forum_type varchar not null, in forum_name varchar not null)
                            option (returns "http://^{URIQADefaultHost}^/dataspace/%U/%U/%U") .
       create iri class ods:proxy "http://^{URIQADefaultHost}^/proxy/%U" (in url varchar not null)
                            option (returns  "http://^{URIQADefaultHost}^/proxy/%U") .
       create iri class ods:site "http://^{URIQADefaultHost}^/dataspace/%U#site" (in uname varchar not null)
                            option (returns "http://^{URIQADefaultHost}^/dataspace/%U#site") .
       create iri class ods:role "http://^{URIQADefaultHost}^/dataspace/%U/%U/%U#%U"
            (in uname varchar not null, in tp varchar not null, in inst varchar not null, in role_name varchar not null)
                            option (returns  "http://^{URIQADefaultHost}^/dataspace/%U/%U/%U#%U" ) .
        # Blog
        create iri class ods:blog_forum "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U"
                (in uname varchar not null, in forum_name varchar not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U") .
        create iri class ods:blog_post "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U/%U"
                (in uname varchar not null, in forum_name varchar not null, in postid varchar not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U/%U" ) .
        create iri class ods:blog_comment "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U/%U/%d"
                (in uname varchar not null, in forum_name varchar not null, in postid varchar not null, in comment_id int not null)
                option (returns  "http://^{URIQADefaultHost}^/dataspace/%U/weblog/%U/%U/%d" ) .
        create iri class ods:tag "http://^{URIQADefaultHost}^/dataspace/%U/concept#%U"
                (in uname varchar not null, in tag varchar not null)
                option (returns  "http://^{URIQADefaultHost}^/dataspace/%U/concept#%U") .
        create iri class ods:blog_post_text "http://^{URIQADefaultHost}^/dataspace/%U/weblog-text/%U/%U"
                (in uname varchar not null, in forum_name varchar not null, in postid varchar not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/weblog-text/%U/%U" ) .
        #Feeds
        create iri class ods:feed "http://^{URIQADefaultHost}^/dataspace/feed/%d" (in feed_id integer not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/feed/%d" ) .
        create iri class ods:feed_item "http://^{URIQADefaultHost}^/dataspace/feed/%d/%d" (in feed_id integer not null, in item_id integer not null)
                option (returns  "http://^{URIQADefaultHost}^/dataspace/feed/%d/%d" ) .
        create iri class ods:feed_item_text "http://^{URIQADefaultHost}^/dataspace/feed/%d/%d/text" (in feed_id integer not null, in item_id integer not null)
                option (returns  "http://^{URIQADefaultHost}^/dataspace/feed/%d/%d/text" ) .
        create iri class ods:feed_mgr "http://^{URIQADefaultHost}^/dataspace/%U/feeds/%U" (in uname varchar not null, in inst_name varchar not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/feeds/%U" ) .
        create iri class ods:feed_comment "http://^{URIQADefaultHost}^/dataspace/%U/feeds/%U/%d/%d"
                (in uname varchar not null, in inst_name varchar not null, in item_id integer not null, in comment_id integer not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/feeds/%U/%d/%d" ) .
        #Bookmark
        create iri class ods:bmk_post "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U/%d"
                (in uname varchar not null, in inst_name varchar not null, in bmk_id integer not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U/%d") .
        create iri class ods:bmk_post_text "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U/%d/text"
                (in uname varchar not null, in inst_name varchar not null, in bmk_id integer not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U/%d/text" ) .
        create iri class ods:bmk_forum "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U"
                ( in uname varchar not null, in forum_name varchar not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/bookmark/%U") .
        #Photo
        create iri class ods:photo_forum "http://^{URIQADefaultHost}^/dataspace/%U/photos/%U"
                (in uname varchar not null, in inst_name varchar not null)
                option (returns  "http://^{URIQADefaultHost}^/dataspace/%U/photos/%U") .
        create iri class ods:photo_post "http://^{URIQADefaultHost}^%s"
                (in path varchar not null) option (returns "http://^{URIQADefaultHost}^/DAV/%s") .
        create iri class ods:photo_post_text "http://^{URIQADefaultHost}^%s/text"
                (in path varchar not null) option (returns "http://^{URIQADefaultHost}^/DAV/%s/text") .
        create iri class ods:photo_comment "http://^{URIQADefaultHost}^%s:comment_%d"
                (in path varchar not null, in comment_id int not null)
                option (returns "http://^{URIQADefaultHost}^/DAV/%s:comment_%d") .
        # Community
        create iri class ods:community_forum "http://^{URIQADefaultHost}^/dataspace/%U/community/%U"
                (in uname varchar not null, in forum_name varchar not null)
                option (returns  "http://^{URIQADefaultHost}^/dataspace/%U/community/%U") .
        # Briefcase
        create iri class ods:odrive_forum "http://^{URIQADefaultHost}^/dataspace/%U/briefcase/%U"
                (in uname varchar not null, in inst_name varchar not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/briefcase/%U" ) .
        create iri class ods:odrive_post "http://^{URIQADefaultHost}^%s"
                (in path varchar not null) option (returns "http://^{URIQADefaultHost}^/DAV/%s") .
        create iri class ods:odrive_post_text "http://^{URIQADefaultHost}^%s/text"
                (in path varchar not null) option (returns "http://^{URIQADefaultHost}^/DAV/%s/text") .
        # Wiki
        create iri class ods:wiki_post "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U/%U"
                (in uname varchar not null, in inst_name varchar not null, in topic_id varchar not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U/%U") .
        create iri class ods:wiki_post_text "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U/%U/text"
                (in uname varchar not null, in inst_name varchar not null, in topic_id varchar not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U/%U/text" ) .
        create iri class ods:wiki_forum "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U"
                ( in uname varchar not null, in forum_name varchar not null)
                option (returns  "http://^{URIQADefaultHost}^/dataspace/%U/wiki/%U" ) .
        #Calendar
        create iri class ods:calendar_event "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U/%d"
                (in uname varchar not null, in inst_name varchar not null, in calendar_id integer not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U/%d" ) .
        create iri class ods:calendar_event_text "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U/%d/text"
                (in uname varchar not null, in inst_name varchar not null, in calendar_id integer not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U/%d/text" ) .
        create iri class ods:calendar_forum "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U"
                ( in uname varchar not null, in forum_name varchar not null)
                option (returns  "http://^{URIQADefaultHost}^/dataspace/%U/calendar/%U") .
        # NNTPF
        create iri class ods:nntp_forum "http://^{URIQADefaultHost}^/dataspace/discussion/%U"
                ( in forum_name varchar not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/discussion/%U").
        create iri class ods:nntp_post "http://^{URIQADefaultHost}^/dataspace/discussion/%U/%U"
                ( in group_name varchar not null, in message_id varchar not null)
                option (returns  "http://^{URIQADefaultHost}^/dataspace/discussion/%U/%U" ) .
        create iri class ods:nntp_post_text "http://^{URIQADefaultHost}^/dataspace/discussion/%U/%U/text"
                ( in group_name varchar not null, in message_id varchar not null)
                option (returns  "http://^{URIQADefaultHost}^/dataspace/discussion/%U/%U/text") .
        create iri class ods:nntp_role "http://^{URIQADefaultHost}^/dataspace/discussion/%U#reader"
                (in forum_name varchar not null)
                option (returns "http://^{URIQADefaultHost}^/dataspace/discussion/%U#reader") .
       ;

SPARQL
    prefix sioc: <http://rdfs.org/sioc/ns#>
    prefix sioct: <http://rdfs.org/sioc/types#>
    prefix atom: <http://atomowl.org/ontologies/atomrdf#>
    prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    prefix foaf: <http://xmlns.com/foaf/0.1/>
    prefix dc: <http://purl.org/dc/elements/1.1/>
    prefix dct: <http://purl.org/dc/terms/>
    prefix skos: <http://www.w3.org/2004/02/skos/core#>
    prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
    prefix bm: <http://www.w3.org/2002/01/bookmark#>
    prefix exif: <http://www.w3.org/2003/12/exif/ns/>
    prefix ann: <http://www.w3.org/2000/10/annotation-ns#>
    prefix wikiont: <http://sw.deri.org/2005/04/wikipedia/wikiont.owl#>
    prefix calendar: <http://www.w3.org/2002/12/cal#>
    prefix ods: <http://www.openlinksw.com/virtuoso/ods/>

    alter quad storage virtrdf:DefaultQuadStorage
      FROM DB.DBA.SIOC_USERS as users
      FROM DB.DBA.SIOC_ODS_FORUMS as forums
      FROM DB.DBA.SIOC_ROLES as roles
      FROM DB.DBA.SIOC_ROLE_GRANTS as grants
      FROM DB.DBA.SIOC_KNOWS as knows
      FROM DB.DBA.ODS_FOAF_PERSON as person
      where (^{person.}^.U_NAME = ^{users.}^.U_NAME)
      where (^{forums.}^.U_NAME = ^{users.}^.U_NAME)
      where (^{knows.}^.TO_NAME = ^{users.}^.U_NAME)
      where (^{knows.}^.FROM_NAME = ^{users.}^.U_NAME)
      where (^{grants.}^.U_NAME = ^{users.}^.U_NAME)
      where (^{roles.}^.U_NAME = ^{users.}^.U_NAME)

      FROM DB.DBA.ODS_BLOG_POSTS as blog_posts
      where (^{blog_posts.}^.B_OWNER = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_BLOG_POST_LINKS as blog_links
      where (^{blog_links.}^.B_OWNER = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_BLOG_POST_ATTS as blog_atts
      where (^{blog_atts.}^.B_OWNER = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_BLOG_POST_TAGS as blog_tags
      where (^{blog_tags.}^.U_NAME = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_BLOG_COMMENTS as blog_comms
      where (^{blog_comms.}^.U_NAME = ^{users.}^.U_NAME)

      FROM DB.DBA.ODS_BMK_POSTS as bmk_posts
      where (^{bmk_posts.}^.U_NAME = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_BMK_TAGS as bmk_tags
      where (^{bmk_tags.}^.U_NAME = ^{users.}^.U_NAME)

      FROM DB.DBA.ODS_ODRIVE_POSTS as odrv_posts
      where (^{odrv_posts.}^.U_MEMBER = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_ODRIVE_TAGS as odrv_tags
      where (^{odrv_tags.}^.U_OWNER = ^{users.}^.U_NAME)

      FROM DB.DBA.ODS_FEED_FEED_DOMAIN as feed_domain
      where (^{feed_domain.}^.U_NAME = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_FEED_POSTS as feed_posts
      where (^{feed_posts.}^.EFI_FEED_ID = ^{feed_domain.}^.EF_ID)
      FROM DB.DBA.ODS_FEED_COMMENTS as feed_comments
      where (^{feed_comments.}^.U_NAME = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_FEED_TAGS as feed_tags
      where (^{feed_tags.}^.U_NAME = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_FEED_LINKS as feed_links
      where (^{feed_links.}^.EFI_FEED_ID = ^{feed_domain.}^.EF_ID)
      FROM DB.DBA.ODS_FEED_ATTS as feed_atts
      where (^{feed_atts.}^.EFI_FEED_ID = ^{feed_domain.}^.EF_ID)

      FROM DB.DBA.ODS_PHOTO_POSTS as photo_posts
      where (^{photo_posts.}^.U_MEMBER = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_PHOTO_COMMENTS as photo_comments
      where (^{photo_comments.}^.U_MEMBER = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_PHOTO_TAGS as photo_tags
      where (^{photo_tags.}^.U_MEMBER = ^{users.}^.U_NAME)

      FROM DB.DBA.ODS_WIKI_POSTS as wiki_posts
      where (^{wiki_posts.}^.U_NAME = ^{users.}^.U_NAME)

      FROM DB.DBA.ODS_COMMUNITIES as community
      where (^{community.}^.C_OWNER = ^{users.}^.U_NAME)

      FROM DB.DBA.ODS_NNTP_GROUPS as nntp_groups
      FROM DB.DBA.ODS_NNTP_POSTS as nntp_posts
      FROM DB.DBA.ODS_NNTP_USERS as nntp_users
      where (^{nntp_users.}^.U_NAME = ^{users.}^.U_NAME)
      FROM DB.DBA.ODS_NNTP_LINKS as nntp_links

    {
        create virtrdf:ODS_DS as graph ods:graph (users.U_NAME) option (exclusive)
          {
            ods:user (users.U_NAME) a sioc:User ;
            sioc:id users.U_NAME ;
            sioc:name users.U_FULL_NAME ;
            sioc:email ods:mbox (users.E_MAIL) ;
            sioc:email_sha1 users.E_MAIL_SHA1 ;
            sioc:account_of ods:person (users.U_NAME) .

            ods:person (person.U_NAME) a foaf:Person ;
            foaf:nick person.U_NAME ;
            foaf:name person.U_FULL_NAME ;
            foaf:mbox ods:mbox (person.E_MAIL) ;
            foaf:mbox_sha1sum person.E_MAIL_SHA1 ;
            foaf:holdsAccount ods:user (person.U_NAME) ;
            foaf:firstName person.FIRST_NAME ;
            foaf:family_name person.LAST_NAME ;
            foaf:gender person.GENDER ;
            foaf:icqChatID person.ICQ ;
            foaf:msnChatID person.MSN ;
            foaf:aimChatID person.AIM ;
            foaf:yahooChatID person.YAHOO ;
            foaf:birthday person.BIRTHDAY ;
            foaf:organization person.ORG ;
            foaf:phone ods:phone (person.PHONE) ;
            foaf:based_near ods:geo_point (person.U_NAME)
            .

            ods:geo_point (person.U_NAME) a geo:Point ;
                 geo:lat person.LAT ;
                 geo:lng person.LNG .

            ods:person (knows.FROM_NAME) foaf:knows ods:person (knows.TO_NAME) .
            ods:person (knows.TO_NAME) foaf:knows ods:person (knows.FROM_NAME) .

            ods:user_group (grants.G_NAME) a sioc:Usergroup ;
                sioc:id grants.G_NAME ;
                sioc:has_member ods:user (grants.U_NAME) .
            ods:user (grants.U_NAME)  sioc:member_of ods:user_group (grants.G_NAME) .

            ods:role (roles.U_NAME, roles.APP_TYPE, roles.WAM_INST, roles.WMT_NAME)
              sioc:has_scope ods:forum (roles.U_NAME, roles.APP_TYPE, roles.WAM_INST) ;
              sioc:function_of ods:user (roles.U_NAME) .

            ods:forum (roles.U_NAME, roles.APP_TYPE, roles.WAM_INST)
                sioc:scope_of ods:role (roles.U_NAME, roles.APP_TYPE, roles.WAM_INST, roles.WMT_NAME) .
            ods:user (roles.U_NAME)
                sioc:has_function ods:role (roles.U_NAME, roles.APP_TYPE, roles.WAM_INST, roles.WMT_NAME) .

            ods:forum (forums.U_NAME, forums.APP_TYPE, forums.WAM_INST) a sioc:Container ;
            sioc:id forums.WAM_INST ;
            sioc:type forums.APP_TYPE ;
            sioc:description forums.WAI_DESCRIPTION ;
            sioc:link ods:proxy (forums.LINK) ;
            sioc:has_space ods:site (forums.U_NAME) .

            # Weblog
            ods:blog_post (blog_posts.B_OWNER, blog_posts.B_INST, blog_posts.B_POST_ID) a sioct:BlogPost ;
            sioc:link ods:proxy (blog_posts.B_LINK) ;
            sioc:has_creator ods:user (blog_posts.B_CREATOR) ;
            foaf:maker ods:person (blog_posts.B_CREATOR) ;
            sioc:has_container ods:blog_forum (blog_posts.B_OWNER, blog_posts.B_INST) ;
            dc:title blog_posts.B_TITLE ;
            dct:created blog_posts.B_CREATED ;
            dct:modified blog_posts.B_MODIFIED ;
            sioc:content blog_posts.B_CONTENT .

            ods:blog_forum (blog_posts.B_OWNER, blog_posts.B_INST)
            sioc:container_of
            ods:blog_post (blog_posts.B_OWNER, blog_posts.B_INST, blog_posts.B_POST_ID) .

            ods:user (blog_posts.B_CREATOR)
            sioc:creator_of
            ods:blog_post (blog_posts.B_OWNER, blog_posts.B_INST, blog_posts.B_POST_ID) .

            ods:blog_post (blog_links.B_OWNER, blog_links.B_INST, blog_links.B_POST_ID)
            sioc:links_to
            ods:proxy (blog_links.PL_LINK) .
            # end Weblog

            # Bookmark
            ods:bmk_post (bmk_posts.U_NAME, bmk_posts.WAI_NAME, bmk_posts.BD_BOOKMARK_ID)
            a bm:Bookmark ;
            dc:title bmk_posts.BD_NAME;
            dct:created bmk_posts.BD_CREATED ;
            dct:modified bmk_posts.BD_LAST_UPDATE ;
            dc:date bmk_posts.BD_LAST_UPDATE ;
            ann:created bmk_posts.BD_CREATED ;
            dc:creator bmk_posts.U_NAME ;
            bm:recalls ods:proxy (bmk_posts.B_URI) ;
            sioc:link ods:proxy (bmk_posts.B_URI) ;
            sioc:content bmk_posts.BD_DESCRIPTION ;
            sioc:has_creator ods:user (bmk_posts.U_NAME) ;
            foaf:maker ods:person (bmk_posts.U_NAME) ;
            sioc:has_container ods:bmk_forum (bmk_posts.U_NAME, bmk_posts.WAI_NAME) .

            ods:bmk_forum (bmk_posts.U_NAME, bmk_posts.WAI_NAME)
            sioc:container_of
            ods:bmk_post (bmk_posts.U_NAME, bmk_posts.WAI_NAME, bmk_posts.BD_BOOKMARK_ID) .

            ods:user (bmk_posts.U_NAME)
            sioc:creator_of
            ods:bmk_post (bmk_posts.U_NAME, bmk_posts.WAI_NAME, bmk_posts.BD_BOOKMARK_ID) .

            ods:bmk_post (bmk_tags.U_NAME, bmk_tags.WAM_INST, bmk_tags.ITEM_ID)
            sioc:topic
            ods:tag (bmk_tags.U_NAME, bmk_tags.BD_TAG) .

            ods:tag (bmk_tags.U_NAME, bmk_tags.BD_TAG) a skos:Concept ;
            skos:prefLabel bmk_tags.BD_TAG ;
            skos:isSubjectOf ods:bmk_post (bmk_tags.U_NAME, bmk_tags.WAM_INST, bmk_tags.ITEM_ID) .
            # end Bookmark

            # Briefcase
            ods:odrive_post (odrv_posts.RES_FULL_PATH) a foaf:Document ;
            dc:title odrv_posts.RES_NAME ;
            dct:created odrv_posts.RES_CREATED ;
            dct:modified odrv_posts.RES_MODIFIED ;
            sioc:content odrv_posts.RES_DESCRIPTION ;
            sioc:has_creator ods:user (odrv_posts.U_OWNER) ;
            foaf:maker ods:person (odrv_posts.U_OWNER) ;
            sioc:has_container ods:odrive_forum (odrv_posts.U_MEMBER, odrv_posts.WAI_NAME) .

            ods:odrive_forum (odrv_posts.U_MEMBER, odrv_posts.WAI_NAME)
            sioc:container_of
            ods:odrive_post (odrv_posts.RES_FULL_PATH) .

            ods:user (odrv_posts.U_OWNER)
            sioc:creator_of
            ods:odrive_post (odrv_posts.RES_FULL_PATH) .

            ods:odrive_post (odrv_tags.RES_FULL_PATH)
            sioc:topic
            ods:tag (odrv_tags.U_OWNER, odrv_tags.TAG) .

            ods:tag (odrv_tags.U_OWNER, odrv_tags.TAG) a skos:Concept ;
            skos:prefLabel odrv_tags.TAG ;
            skos:isSubjectOf ods:odrive_post (odrv_tags.RES_FULL_PATH) .
            # end Briefcase

            # Feeds
            ods:feed (feed_domain.EF_ID) a atom:Feed ;
            sioc:link ods:proxy (feed_domain.EF_URI) ;
            atom:link ods:proxy (feed_domain.EF_URI) ;
            atom:title feed_domain.EF_TITLE ;
            sioc:has_parent ods:feed_mgr (feed_domain.U_NAME, feed_domain.WAI_NAME) .

            ods:feed_mgr (feed_domain.U_NAME, feed_domain.WAI_NAME)
            sioc:parent_of ods:feed (feed_domain.EF_ID) .

            ods:feed_item (feed_tags.EFI_FEED_ID, feed_tags.EFID_ITEM_ID)
            sioc:topic
            ods:tag (feed_tags.U_NAME, feed_tags.EFID_TAG) .

            ods:tag (feed_tags.U_NAME, feed_tags.EFID_TAG) a skos:Concept ;
            skos:prefLabel feed_tags.EFID_TAG ;
            skos:isSubjectOf ods:feed_item (feed_tags.EFI_FEED_ID, feed_tags.EFID_ITEM_ID) .

            ods:feed_comment (feed_comments.U_NAME, feed_comments.WAI_NAME, feed_comments.EFIC_ITEM_ID, feed_comments.EFIC_ID)
            a sioct:Comment ;
            dc:title feed_comments.EFIC_TITLE ;
            sioc:content feed_comments.EFIC_COMMENT ;
            dct:modified feed_comments.LAST_UPDATE ;
            dct:created feed_comments.LAST_UPDATE ;
            sioc:link ods:proxy (feed_comments.LINK) ;
            sioc:has_container ods:feed (feed_comments.EFI_FEED_ID) ;
            sioc:reply_of ods:feed_item (feed_comments.EFI_FEED_ID, feed_comments.EFIC_ITEM_ID) ;
            foaf:maker ods:proxy (feed_comments.EFIC_U_URL) .

            ods:proxy (feed_comments.EFIC_U_URL) a foaf:Person ;
            foaf:name feed_comments.EFIC_U_NAME;
            foaf:mbox ods:mbox (feed_comments.EFIC_U_MAIL) .

            ods:feed (feed_comments.EFI_FEED_ID)
            sioc:container_of
            ods:feed_comment (feed_comments.U_NAME, feed_comments.WAI_NAME, feed_comments.EFIC_ITEM_ID, feed_comments.EFIC_ID) .

            ods:feed_item (feed_comments.EFI_FEED_ID, feed_comments.EFIC_ITEM_ID)
            sioc:has_reply
            ods:feed_comment (feed_comments.U_NAME, feed_comments.WAI_NAME, feed_comments.EFIC_ITEM_ID, feed_comments.EFIC_ID) .

            ods:feed_item (feed_links.EFI_FEED_ID, feed_links.EFI_ID)
            sioc:links_to
            ods:proxy (feed_links.EFIL_LINK) .

            ods:feed_item (feed_atts.EFI_FEED_ID, feed_atts.EFI_ID)
            sioc:attachment
            ods:proxy (feed_atts.EFIE_URL) .

            ods:feed_item (feed_posts.EFI_FEED_ID, feed_posts.EFI_ID) a atom:Entry ;
            sioc:has_container ods:feed (feed_posts.EFI_FEED_ID) ;
            dc:title feed_posts.EFI_TITLE ;
            dct:created feed_posts.PUBLISH_DATE ;
            dct:modified feed_posts.PUBLISH_DATE ;
            sioc:link ods:proxy (feed_posts.EFI_LINK) ;
            sioc:content feed_posts.EFI_DESCRIPTION ;
            atom:title feed_posts.EFI_TITLE ;
            atom:source ods:feed (feed_posts.EFI_FEED_ID) ;
            atom:published feed_posts.PUBLISH_DATE ;
            atom:updated feed_posts.PUBLISH_DATE ;
            atom:content ods:feed_item_text (feed_posts.EFI_FEED_ID, feed_posts.EFI_ID) .

            ods:feed (feed_posts.EFI_FEED_ID) sioc:container_of ods:feed_item (feed_posts.EFI_FEED_ID, feed_posts.EFI_ID) .

            ods:feed_item_text (feed_posts.EFI_FEED_ID, feed_posts.EFI_ID) a atom:Content ;
            atom:type "text/xhtml" ;
            atom:lang "en-US" ;
            atom:body feed_posts.EFI_DESCRIPTION .

            ods:feed (feed_posts.EFI_FEED_ID)
            atom:contains
            ods:feed_item (feed_posts.EFI_FEED_ID, feed_posts.EFI_ID) .
            # end Feeds

            # Photo
            ods:photo_post (photo_posts.RES_FULL_PATH) a exif:IFD ;
            dc:title photo_posts.RES_NAME ;
            dct:created photo_posts.RES_CREATED ;
            dct:modified photo_posts.RES_MODIFIED ;
            sioc:content photo_posts.RES_DESCRIPTION ;
            sioc:has_creator ods:user (photo_posts.U_OWNER) ;
            foaf:maker ods:person (photo_posts.U_OWNER) ;
            sioc:link ods:proxy (photo_posts.RES_LINK) ;
            sioc:has_container ods:photo_forum (photo_posts.U_MEMBER, photo_posts.WAI_NAME) .

            ods:photo_forum (photo_posts.U_MEMBER, photo_posts.WAI_NAME)
            sioc:container_of
            ods:photo_post (photo_posts.RES_FULL_PATH) .

            ods:user (photo_posts.U_OWNER)
            sioc:creator_of
            ods:photo_post (photo_posts.RES_FULL_PATH) .

            ods:photo_post (photo_tags.RES_FULL_PATH)
            sioc:topic
            ods:tag (photo_tags.U_MEMBER, photo_tags.RES_TAG) .

            ods:tag (photo_tags.U_MEMBER, photo_tags.RES_TAG) a skos:Concept ;
            skos:prefLabel photo_tags.RES_TAG ;
            skos:isSubjectOf ods:photo_post (photo_tags.RES_FULL_PATH) .

            ods:photo_comment (photo_comments.RES_FULL_PATH, photo_comments.COMMENT_ID) a sioct:Comment ;
            sioc:reply_of ods:photo_post (photo_comments.RES_FULL_PATH) ;
            sioc:has_container ods:photo_forum (photo_comments.U_MEMBER, photo_comments.WAI_NAME) ;
            dc:title photo_comments.RES_NAME ;
            dct:created photo_comments.CREATE_DATE ;
            dct:modified photo_comments.MODIFY_DATE ;
            sioc:content photo_comments.TEXT ;
            foaf:maker ods:person (photo_comments.U_MAKER) .

            ods:photo_post (photo_comments.RES_FULL_PATH)
            sioc:has_reply
            ods:photo_comment (photo_comments.RES_FULL_PATH, photo_comments.COMMENT_ID) .
            # end Photo

            # Polls
            # end Polls

            # Mail
            # end Mail

            # Wiki
            ods:wiki_post (wiki_posts.U_NAME, wiki_posts.CLUSTERNAME, wiki_posts.LOCALNAME) a wikiont:Article ;
            dc:title wiki_posts.LOCALNAME ;
            dct:created wiki_posts.RES_CREATED ;
            dct:modified wiki_posts.RES_MODIFIED ;
            sioc:content wiki_posts.RES_CONTENT ;
            sioc:has_creator ods:user (wiki_posts.U_NAME) ;
            foaf:maker ods:person (wiki_posts.U_NAME) ;
            sioc:has_container ods:wiki_forum (wiki_posts.U_NAME, wiki_posts.CLUSTERNAME) .

            ods:wiki_forum (wiki_posts.U_NAME, wiki_posts.CLUSTERNAME)
            sioc:container_of
            ods:wiki_post (wiki_posts.U_NAME, wiki_posts.CLUSTERNAME, wiki_posts.LOCALNAME) .

            ods:user (wiki_posts.U_NAME)
            sioc:creator_of
            ods:wiki_post (wiki_posts.U_NAME, wiki_posts.CLUSTERNAME, wiki_posts.LOCALNAME) .

            # end Wiki

            # Community
            ods:community_forum (community.C_OWNER, community.CM_COMMUNITY_ID) a sioc:Community ;
            sioc:has_part ods:forum (community.A_OWNER, community.A_TYPE, community.CM_MEMBER_APP) .

            ods:forum (community.A_OWNER, community.A_TYPE, community.CM_MEMBER_APP)
            sioc:part_of
            ods:community_forum (community.C_OWNER, community.CM_COMMUNITY_ID) .
            # end Community

            # NNTP
            ods:nntp_forum (nntp_groups.NG_NAME) a sioct:MessageBoard ;
            sioc:id nntp_groups.NG_NAME ;
            sioc:description nntp_groups.NG_DESC .

            ods:nntp_post (nntp_posts.NG_NAME, nntp_posts.NM_ID) a sioct:BoardPost ;
            sioc:content nntp_posts.NM_BODY ;
            dc:title nntp_posts.FTHR_SUBJ ;
            dct:created  nntp_posts.REC_DATE ;
            dct:modified nntp_posts.REC_DATE ;
            foaf:maker ods:proxy (nntp_posts.MAKER) ;
            sioc:reply_of ods:nntp_post (nntp_posts.NG_NAME, nntp_posts.FTHR_REFER) ;
            sioc:has_container ods:nntp_forum (nntp_posts.NG_NAME) .

            ods:nntp_post (nntp_posts.NG_NAME, nntp_posts.FTHR_REFER)
            sioc:has_reply
            ods:nntp_post (nntp_posts.NG_NAME, nntp_posts.NM_ID) .

            ods:nntp_forum (nntp_posts.NG_NAME)
            sioc:container_of
            ods:nntp_post (nntp_posts.NG_NAME, nntp_posts.NM_ID) .

            ods:nntp_role (nntp_groups.NG_NAME)
            sioc:has_scope
            ods:nntp_forum (nntp_groups.NG_NAME) .

            ods:nntp_forum (nntp_groups.NG_NAME)
            sioc:scope_of
            ods:nntp_role (nntp_groups.NG_NAME) .

            ods:user (nntp_users.U_NAME)
            sioc:has_function
            ods:nntp_role (nntp_users.NG_NAME) .

            ods:nntp_role (nntp_users.NG_NAME)
            sioc:function_of
            ods:user (nntp_users.U_NAME) .

            ods:nntp_post (nntp_links.NG_NAME, nntp_links.NML_MSG_ID)
            sioc:links_to
            ods:proxy (nntp_links.NML_URL) .
            # end NNTP

          } .
    } .
;

URL Rewrite Rules for ODS

create procedure DB.DBA.URL_REW_ODS_ACCEPT ()
{
  declare accept, ret any;
  accept := http_request_header (http_request_header (), 'Accept');
  if (not isstring (accept))
    return null;
  ret := null;
  if (regexp_match ('(application|text)/rdf.(xml|n3|turtle|ttl)', accept) is not null)
    {
      if (regexp_match ('application/rdf.xml', accept) is not null)
        {
          ret := 'rdf';
        }
      else if (regexp_match ('text/rdf.n3', accept) is not null)
        {
          ret := 'n3';
        }
      else if (regexp_match ('application/rdf.turtle', accept) is not null or
            regexp_match ('application/rdf.ttl', accept) is not null)
        {
          ret := 'n3';
        }
    }
  return ret;
};

create procedure  DB.DBA.URL_REW_ODS_SPQ (in graph varchar, in iri varchar, in acc varchar)
{
  declare q, ret any;
  iri := replace (iri, '''', '%27');
  iri := replace (iri, '<', '%3C');
  iri := replace (iri, '>', '%3E');
  q := sprintf ('define input:inference <%s> DESCRIBE <%s> FROM <%s>', graph, iri, graph);
  ret := sprintf ('/sparql?query=%U&format=%U', q, acc);
  return ret;
};

create procedure DB.DBA.URL_REW_ODS_USER (in par varchar, in fmt varchar, in val varchar)
{
--  dbg_obj_print (current_proc_name ());
  declare acc, ret any;
  declare q, iri, graph any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
      graph := sioc..get_graph ();
      iri := sprintf ('%s/%U', graph, val);
      if (val like 'person/%')
        {
          val := substring (val, 8, length (val));
          ret := sprintf ('/ods/foaf.vsp?uname=%U&fmt=%U', val, acc);
        }
      else
        ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
    }
  else
    {
      http_header (http_header_get ()||sprintf ('X-XRDS-Location: %s\r\n',
            DB.DBA.wa_link (1, '/dataspace/'||val||'/yadis.xrds')));

      if (val like 'person/%')
        val := substring (val, 8, length (val));
      ret := sprintf ('/ods/uhome.vspx?page=1&ufname=%s', val);
    }
  return ret;
};

create procedure DB.DBA.URL_REW_ODS_USER_GEM (in par varchar, in fmt varchar, in val varchar)
{
--  dbg_obj_print (current_proc_name ());
  declare acc, ret any;
  declare q, iri, graph, path, is_person any;

  path := http_path ();
  if (path like '%.rdf')
    acc := 'rdf';
  else if (path like '%.n3')
    acc := 'n3';
  else if (path like '%.ttl')
    acc := 'n3';
  else if (path like '%/yadis.xrds')
    acc := 'yadis';
  else
    acc := 'rdf';

  if (acc <> 'yadis')
    {
      is_person := matches_like (path, '%/about.%');
      graph := sioc..get_graph ();
      if (is_person)
        {
          --iri := sprintf ('%s/person/%U', graph, val);
          ret := sprintf ('/ods/foaf.vsp?uname=%U&fmt=%U', val, acc);
        }
      else
        {
          iri := sprintf ('%s/%U', graph, val);
          ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
        }
    }
  else
    {
      ret := sprintf ('/ods/yadis.vsp?uname=%U', val);
    }
  return ret;
};

create procedure DB.DBA.URL_REW_ODS_GEM (in par varchar, in fmt varchar, in val varchar)
{
--  dbg_obj_print (current_proc_name ());
  declare acc, ret any;
  declare q, iri, graph, path, pos any;

  path := http_path ();
  if (path like '%.rdf')
    acc := 'rdf';
  else if (path like '%.n3')
    acc := 'n3';
  else if (path like '%.ttl')
    acc := 'n3';
  else
    acc := 'rdf';
  graph := sioc..get_graph ();
  pos := strrchr (path, '/');
  path := subseq (path, 0, pos);

  if (val = 'person')
    {
      pos := strrchr (path, '/');
      val := subseq (path, pos+1, length (path));
      ret := sprintf ('/ods/foaf.vsp?uname=%U&fmt=%U', val, acc);
    }
  else
    {
      iri := sprintf ('http://%s%s', sioc..get_cname (), path);
      ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
    }
  return ret;
};

create procedure DB.DBA.URL_REW_ODS_APP (in par varchar, in fmt varchar, in val varchar)
{
--  dbg_obj_print (current_proc_name (), val);
  if (par = 'app')
    return sprintf (fmt, wa_app_to_type (val));
  return sprintf (fmt, val);
};

create procedure DB.DBA.URL_REW_ODS_BLOG (in par varchar, in fmt varchar, in val varchar)
{
--  dbg_obj_print (par, fmt, val);
--  dbg_obj_print (current_proc_name (), val);
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
      if (par = 'inst')
        {
          declare q, iri, graph any;
          graph := sioc..get_graph ();
          iri := 'http://' || sioc..get_cname () || http_path ();
          ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
          return ret;
        }
      else
        return '';
    }
  else if (par = 'inst')
    {
      declare url any;
      val := split_and_decode (val)[0];
      url := (SELECT WAM_HOME_PAGE FROM WA_MEMBER WHERE WAM_INST = val AND WAM_MEMBER_TYPE = 1);
      if (url is not null)
        val := url;
      return sprintf (fmt, val);
    }
  else if (par = 'id' and val <> '')
    {
      if (atoi (val) = 0 and val <> '0')
        fmt := '%s';
      else
        fmt := '?id=%s';
      return sprintf (fmt, val);
    }
};

create procedure DB.DBA.URL_REW_ODS_NNTP (in par varchar, in fmt varchar, in val varchar)
{
--  dbg_obj_print (par, fmt, val);
--  dbg_obj_print (current_proc_name (), val);
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
       declare q, iri, graph any;
       graph := sioc..get_graph ();
       iri := 'http://' || sioc..get_cname () || http_path ();
--       dbg_obj_print (iri);
       ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
       return ret;
    }
  else if (par = 'grp')
    {
      declare gid int;
      val := split_and_decode (val)[0];
      gid := (SELECT NG_GROUP FROM DB.DBA.NEWS_GROUPS WHERE NG_NAME = val);
      ret := sprintf ('/nntpf/nntpf_nthread_view.vspx?group=%d', gid);
      return ret;
    }
  else if (par = 'post')
    {
      ret := sprintf ('/nntpf/nntpf_disp_article.vspx?id=%U', encode_base64 (val));
      return ret;
    }
}
;

create procedure DB.DBA.URL_REW_ODS_XD (in par varchar, in fmt varchar, in val varchar)
{
--  dbg_obj_print (par, fmt, val);
--  dbg_obj_print (current_proc_name (), val);
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
       declare q, iri, graph any;
       graph := sioc..get_graph ();
       iri := 'http://' || sioc..get_cname () || http_path ();
--       dbg_obj_print (iri);
       ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
       return ret;
    }
  else if (par = 'inst')
    {
      val := split_and_decode (val)[0];
      ret := (SELECT WAM_HOME_PAGE FROM WA_MEMBER WHERE WAM_INST = val and WAM_MEMBER_TYPE = 1);
      return ret;
    }
}
;

create procedure DB.DBA.URL_REW_ODS_WIKI (in par varchar, in fmt varchar, in val varchar)
{
--  dbg_obj_print (par, fmt, val);
--  dbg_obj_print (current_proc_name (), val);
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
       declare q, iri, graph any;
       graph := sioc..get_graph ();
       iri := 'http://' || sioc..get_cname () || http_path ();
--       dbg_obj_print (iri);
       ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
       return ret;
    }
  else if (par = 'inst')
    {
      declare _inst DB.DBA.web_app;
      _inst := (SELECT WAI_INST FROM WA_INSTANCE WHERE WAI_NAME = val);
      ret := _inst.wa_post_url (null, null, val, val);
--      dbg_obj_print ('ret', ret);
      return ret;
    }
  else if (par = 'post')
    {
      return '/'||val;
    }
}
;

create procedure DB.DBA.URL_REW_ODS_PHOTO (in par varchar, in fmt varchar, in val varchar)
{
--  dbg_obj_print (par, fmt, val);
--  dbg_obj_print (current_proc_name (), val);
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
       declare q, iri, graph any;
       graph := sioc..get_graph ();
       iri := 'http://' || sioc..get_cname () || http_path ();
--       dbg_obj_print (iri);
       ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
       return ret;
    }
  else if (par = 'inst')
    {
      val := split_and_decode (val)[0];
      ret := (SELECT WAM_HOME_PAGE FROM WA_MEMBER WHERE WAM_INST = val AND WAM_MEMBER_TYPE = 1);
      return ret;
    }
  else if (par = 'post')
    {
      declare id int;
      declare col, nam varchar;
      declare exit handler for not found
        {
          signal ('22023', sprintf ('The resource %d doesn''t exists', id));
        };
      id := atoi(ltrim(val, '/'));
      SELECT RES_FULL_PATH INTO nam FROM WS.WS.SYS_DAV_RES WHERE RES_ID = id;
      return nam;
    }
}
;

create procedure DB.DBA.URL_REW_ODS_ADDRESSBOOK (in par varchar, in fmt varchar, in val varchar)
{
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
      if (par = 'instance')
        {
          declare q, iri, graph any;
          graph := sioc..get_graph ();
          iri := 'http://' || sioc..get_cname () || http_path ();
          ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
          return ret;
              }
      else
              return '';
    }
  else if (par = 'instance')
    {
      declare id, url any;
      val := split_and_decode (val)[0];
      id := AB.WA.domain_id (val);
      if (id is not null) {
        url := AB.WA.ab_url (id);
        if (url is not null)
          val := url;
      }
      return sprintf (fmt, val);
    }
  else if (par = 'params')
    {
      if (atoi (val) = 0 and val <> '0')
        fmt := '%s';
      else
        fmt := '?id=%s';
      return sprintf (fmt, val);
    }
}
;

create procedure DB.DBA.URL_REW_ODS_BOOKMARK (in par varchar, in fmt varchar, in val varchar)
{
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
      if (par = 'instance')
        {
          declare q, iri, graph any;
          graph := sioc..get_graph ();
          iri := 'http://' || sioc..get_cname () || http_path ();
          ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
          return ret;
              }
      else
              return '';
    }
  else if (par = 'instance')
    {
      declare id, url any;
      val := split_and_decode (val)[0];
      id := BMK.WA.domain_id (val);
      if (id is not null) {
        url := BMK.WA.bookmark_url (id);
        if (url is not null)
          val := url;
      }
      return sprintf (fmt, val);
    }
  else if (par = 'params')
    {
      if (atoi (val) = 0 and val <> '0')
        fmt := '%s';
      else
        fmt := '?id=%s';
      return sprintf (fmt, val);
    }
}
;

create procedure DB.DBA.URL_REW_ODS_BRIEFCASE (in par varchar, in fmt varchar, in val varchar)
{
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
      if (par = 'instance')
        {
          declare q, iri, graph any;
          graph := sioc..get_graph ();
          iri := 'http://' || sioc..get_cname () || http_path ();
          ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
          return ret;
              }
      else
              return '';
    }
  else if (par = 'instance')
    {
      declare id, url any;
      val := split_and_decode (val)[0];
      id := ODRIVE.WA.domain_id (val);
      if (id is not null) {
        url := ODRIVE.WA.odrive_url (id);
        if (url is not null)
          val := url;
      }
      return sprintf (fmt, val);
    }
  else if (par = 'params')
    {
      if (atoi (val) = 0 and val <> '0')
        fmt := '%s';
      else
        fmt := '?id=%s';
      return sprintf (fmt, val);
    }
}
;

create procedure DB.DBA.URL_REW_ODS_CALENDAR (in par varchar, in fmt varchar, in val varchar)
{
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
      if (par = 'instance')
        {
          declare q, iri, graph any;
          graph := sioc..get_graph ();
          iri := 'http://' || sioc..get_cname () || http_path ();
          ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
          return ret;
              }
      else
              return '';
    }
  else if (par = 'instance')
    {
      declare id, url any;
      val := split_and_decode (val)[0];
      id := CAL.WA.domain_id (val);
      if (id is not null) {
        url := CAL.WA.calendar_url (id);
        if (url is not null)
          val := url;
      }
      return sprintf (fmt, val);
    }
  else if (par = 'params')
    {
      if (atoi (val) = 0 and val <> '0')
        fmt := '%s';
      else
        fmt := '?id=%s';
      return sprintf (fmt, val);
    }
}
;

create procedure DB.DBA.URL_REW_ODS_FEEDS (in par varchar, in fmt varchar, in val varchar)
{
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
      if (par = 'instance')
        {
          declare q, iri, graph any;
          graph := sioc..get_graph ();
          iri := 'http://' || sioc..get_cname () || http_path ();
          ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
          return ret;
              }
      else
              return '';
    }
  else if (par = 'instance')
    {
      declare id, url any;
      val := split_and_decode (val)[0];
      id := ENEWS.WA.domain_id (val);
      if (id is not null) {
        url := ENEWS.WA.enews_url (id) || 'news.vspx';
        if (url is not null)
          val := url;
      }
      return sprintf (fmt, val);
    }
  else if (par = 'params')
    {
      if (atoi (val) = 0 and val <> '0')
        fmt := '%s';
      else
        fmt := '?id=%s';
      return sprintf (fmt, val);
    }
}
;

create procedure DB.DBA.URL_REW_ODS_POLLS (in par varchar, in fmt varchar, in val varchar)
{
  declare acc, ret any;

  acc := DB.DBA.URL_REW_ODS_ACCEPT ();
  if (acc is not null)
    {
      if (par = 'instance')
        {
          declare q, iri, graph any;
          graph := sioc..get_graph ();
          iri := 'http://' || sioc..get_cname () || http_path ();
          ret := DB.DBA.URL_REW_ODS_SPQ (graph, iri, acc);
          return ret;
              }
      else
              return '';
    }
  else if (par = 'instance')
    {
      declare id, url any;
      val := split_and_decode (val)[0];
      id := POLLS.WA.domain_id (val);
      if (id is not null) {
        url := POLLS.WA.polls_url (id);
        if (url is not null)
          val := url;
      }
      return sprintf (fmt, val);
    }
  else if (par = 'params')
    {
      if (atoi (val) = 0 and val <> '0')
        fmt := '%s';
      else
        fmt := '?id=%s';
      return sprintf (fmt, val);
    }
}
;

create procedure DB.DBA.URL_REW_ODS_FOAF_EXT (in par varchar, in fmt varchar, in val varchar)
{
  if (par = '*accept*')
    {
      declare ext any;
      ext := 'rdf';
      if (val = 'text/rdf+n3')
        ext := 'n3';
      return sprintf (fmt, ext);
    }
  else
    return sprintf (fmt, val);
}
;

create procedure ur_ods_rdf_doc (in path varchar)
{
  declare r any;
  r := regexp_match ('[^/]*\x24', path);
  return r||'#this';
};

create procedure ur_ods_html_doc (in path varchar)
{
  declare pos, r any;
  if (path like '%/foaf.%')
    {
      pos := strrchr (path, '/');
    }
  else if (path like '%#%')
    {
      pos := strrchr (path, '#');
    }
  if (pos > 0)
    r := subseq (path, 0, pos);
  else
    r := '/';
  return r;
};
-- ODS Rules

-- http://cname/dataspace/uname
-- http://cname/dataspace/person/uname

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule1', 1,
    '/dataspace/((person/)?[^/#]*)', vector('ufname'), 1,
    '%s', vector('ufname'),
    'DB.DBA.URL_REW_ODS_USER');

-- http://cname/dataspace/uname with Accept will do 303 to the /sparql
DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule2', 1,
    '/dataspace/([^/]*)', vector('ufname'), 1,
    '/sparql?query=define+input%%3Ainference+%%3Chttp%%3A//^{URIQADefaultHost}^/dataspace%%3E+DESCRIBE+%%3Chttp%%3A//^{URIQADefaultHost}^/dataspace/%U%%3E+FROM+%%3Chttp%%3A//^{URIQADefaultHost}^/dataspace%%3E&format=%U', vector('ufname', '*accept*'),
    null,
    '(application|text)/rdf.(xml|n3|turtle|ttl)',
    0,
    303);

-- http://cname/dataspace/uname/app_type
DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule3', 1,
    '/dataspace/((?!person)[^/]*)/([^\\./]*)', vector('ufname', 'app'), 2,
    '/ods/app_inst.vspx?app=%s&ufname=%s&l=1', vector('app', 'ufname'),
    'DB.DBA.URL_REW_ODS_APP');

-- http://cname/dataspace/uname/file.ext
DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule4', 1,
    '/dataspace/([^/]*)/(sioc|about|yadis)\\.(rdf|n3|ttl|xrds)', vector('ufname', 'file', 'fmt'), 3,
    '%s', vector('ufname'),
    'DB.DBA.URL_REW_ODS_USER_GEM');

-- Rules for FOAF profile

-- http://cname/dataspace/person/uname with Accept, do 303 to http://cname/dataspace/person/uname/foaf.ext
DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule5', 1,
    '/dataspace/person/([^/#]*)/?', vector('ufname'), 1,
    '/dataspace/person/%U/foaf.%s', vector('ufname', '*accept*'),
    'DB.DBA.URL_REW_ODS_FOAF_EXT',
    '(application|text)/rdf.(xml|n3|turtle|ttl)',
    2,
    303);

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule6', 1,
    '/dataspace/person/([^/]*)/page/([^/]*)/?', vector('ufname', 'page'), 1,
    '/dataspace/person/%U/foaf.%s?page=%s', vector('ufname', '*accept*', 'page'),
    'DB.DBA.URL_REW_ODS_FOAF_EXT',
    '(application|text)/rdf.(xml|n3|turtle|ttl)',
    2,
    303);

-- http://cname/dataspace/person/uname/foaf.ext
DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_rule7', 1,
    '/dataspace/person/([^/]*)/foaf.(rdf|n3|ttl)', vector('ufname', 'fmt'), 1,
    '/ods/foaf.vsp?uname=%U&fmt=%U', vector('ufname', 'fmt'),
    null,
    null,
    2,
    null);

-- App Instance Gem

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_post_gem_rule', 1,
    '/dataspace/([^/]*)/([^/]*)/([^/]*/)?([^/]*/)?(sioc|about)\\.(rdf|n3|ttl)', vector('ufname', 'app', 'inst'), 4,
    '%s', vector('ufname'),
    'DB.DBA.URL_REW_ODS_GEM');

-- Weblog Rules

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_blog_rule1', 1,
    '/dataspace/([^/]*)/weblog/([^/]*)', vector('ufname', 'inst'), 2,
    '%s', vector('inst'),
    'DB.DBA.URL_REW_ODS_BLOG');

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_blog_rule2', 1,
    '/dataspace/([^/]*)/weblog/([^/]*)/([^/]*)', vector('ufname', 'inst', 'id'), 3,
    '%s%s', vector('inst', 'id'),
    'DB.DBA.URL_REW_ODS_BLOG');

-- Discussion rules

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_nntp_rule1', 1,
    '/dataspace/discussion/([^/]*)', vector('grp'), 1,
    '%s', vector('grp'),
    'DB.DBA.URL_REW_ODS_NNTP');

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_nntp_rule2', 1,
    '/dataspace/discussion/([^/]*)/((?!sioc)(?!about)[^/]*)', vector('grp', 'post'), 2,
    '%s', vector('post'),
    'DB.DBA.URL_REW_ODS_NNTP');

-- Community

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_xd_rule1', 1,
    '/dataspace/([^/]*)/community/([^/]*)', vector('ufname', 'inst'), 2,
    '%s', vector('inst'),
    'DB.DBA.URL_REW_ODS_XD');

-- Wiki

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_wiki_rule1', 1,
    '/dataspace/([^/]*)/wiki/([^/]*)', vector('ufname', 'inst'), 2,
    '%s', vector('inst'),
    'DB.DBA.URL_REW_ODS_WIKI');

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_wiki_rule2', 1,
    '/dataspace/([^/]*)/wiki/([^/]*)/([^/]*)', vector('ufname', 'inst', 'post'), 2,
    '%s%s', vector('inst', 'post'),
    'DB.DBA.URL_REW_ODS_WIKI');

-- Gallery

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_photo_rule1', 1,
    '/dataspace/([^/]*)/photos/([^/]*)', vector('ufname', 'inst'), 2,
    '%s', vector('inst'),
    'DB.DBA.URL_REW_ODS_PHOTO');

DB.DBA.URLREWRITE_CREATE_REGEX_RULE ('ods_photo_rule2', 1,
    '/dataspace/([^/]*)/photos/([^/]*)/([^/]*)', vector('ufname', 'inst', 'post'), 2,
    '%s', vector('post'),
    'DB.DBA.URL_REW_ODS_PHOTO');

-- AddressBook

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_addressbook_rule1',
    1,
    '/dataspace/([^/]*)/addressbook/([^/]*)',
    vector('uname', 'instance'),
    2,
    '%s', vector('instance'),
    'DB.DBA.URL_REW_ODS_ADDRESSBOOK');

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_addressbook_rule2',
    1,
    '/dataspace/([^/]*)/addressbook/([^/]*)/(.*)',
    vector('uname', 'instance', 'params'),
    3,
    '%s%s',
    vector('instance', 'params'),
    'DB.DBA.URL_REW_ODS_ADDRESSBOOK');

-- Bookmark

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_bookmark_rule1',
    1,
    '/dataspace/([^/]*)/bookmark/([^/]*)',
    vector('uname', 'instance'),
    2,
    '%s', vector('instance'),
    'DB.DBA.URL_REW_ODS_BOOKMARK');

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_bookmark_rule2',
    1,
    '/dataspace/([^/]*)/bookmark/([^/]*)/(.*)',
    vector('uname', 'instance', 'params'),
    3,
    '%s%s',
    vector('instance', 'params'),
    'DB.DBA.URL_REW_ODS_BOOKMARK');

-- Briefcase

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_briefcase_rule1',
    1,
    '/dataspace/([^/]*)/briefcase/([^/]*)',
    vector('uname', 'instance'),
    2,
    '%s', vector('instance'),
    'DB.DBA.URL_REW_ODS_BRIEFCASE');

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_briefcase_rule2',
    1,
    '/dataspace/([^/]*)/briefcase/([^/]*)/(.*)',
    vector('uname', 'instance', 'params'),
    3,
    '%s%s',
    vector('instance', 'params'),
    'DB.DBA.URL_REW_ODS_BRIEFCASE');

-- Calendar

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_calendar_rule1',
    1,
    '/dataspace/([^/]*)/calendar/([^/]*)',
    vector('uname', 'instance'),
    2,
    '%s', vector('instance'),
    'DB.DBA.URL_REW_ODS_CALENDAR');

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_calendar_rule2',
    1,
    '/dataspace/([^/]*)/calendar/([^/]*)/(.*)',
    vector('uname', 'instance', 'params'),
    3,
    '%s%s',
    vector('instance', 'params'),
    'DB.DBA.URL_REW_ODS_CALENDAR');

-- Feeds

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_feeds_rule1',
    1,
    '/dataspace/([^/]*)/feeds/([^/]*)',
    vector('uname', 'instance'),
    2,
    '%s', vector('instance'),
    'DB.DBA.URL_REW_ODS_FEEDS');

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_feeds_rule2',
    1,
    '/dataspace/([^/]*)/feeds/([^/]*)/(.*)',
    vector('uname', 'instance', 'params'),
    3,
    '%s%s',
    vector('instance', 'params'),
    'DB.DBA.URL_REW_ODS_FEEDS');

-- Polls

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_polls_rule1',
    1,
    '/dataspace/([^/]*)/polls/([^/]*)',
    vector('uname', 'instance'),
    2,
    '%s', vector('instance'),
    'DB.DBA.URL_REW_ODS_POLLS');

DB.DBA.URLREWRITE_CREATE_REGEX_RULE (
    'ods_polls_rule2',
    1,
    '/dataspace/([^/]*)/polls/([^/]*)/(.*)',
    vector('uname', 'instance', 'params'),
    3,
    '%s%s',
    vector('instance', 'params'),
    'DB.DBA.URL_REW_ODS_POLLS');

-- ODS Base rules
DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_base_rule_list1', 1,
        vector(
                'ods_rule1', 'ods_rule2', 'ods_rule3', 'ods_rule4'
              ));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_foaf_rule_list1', 1,
        vector(
                'ods_rule5', 'ods_rule6', 'ods_rule7'
              ));

DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_gems_rule_list1', 1,
        vector(
                'ods_post_gem_rule'
              ));

-- ODS Blog rules
DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_blog_rule_list1', 1,
        vector(
                'ods_blog_rule1', 'ods_blog_rule2'
              ));

-- ODS Discussion rules
DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_nntp_rule_list1', 1,
        vector(
                'ods_nntp_rule1', 'ods_nntp_rule2'
              ));

-- ODS Community rules
DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_xd_rule_list1', 1,
        vector(
                'ods_xd_rule1'
              ));

-- ODS Wiki rules
DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_wiki_rule_list1', 1,
        vector(
                'ods_wiki_rule1', 'ods_wiki_rule2'
              ));

-- ODS Gallery rules
DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_photo_rule_list1', 1,
        vector(
                'ods_photo_rule1', 'ods_photo_rule2'
              ));

-- ODS AddressBook rules
DB.DBA.URLREWRITE_CREATE_RULELIST (
    'ods_addressbook_rule_list1',
    1,
    vector (
                'ods_addressbook_rule1',
            'ods_addressbook_rule2'
          ));

-- ODS Bookmark rules
DB.DBA.URLREWRITE_CREATE_RULELIST (
    'ods_bookmark_rule_list1',
    1,
    vector (
                'ods_bookmark_rule1',
            'ods_bookmark_rule2'
          ));

-- ODS Briefcase rules
DB.DBA.URLREWRITE_CREATE_RULELIST (
    'ods_briefcase_rule_list1',
    1,
    vector (
                'ods_briefcase_rule1',
            'ods_briefcase_rule2'
          ));

-- ODS Calendar rules
DB.DBA.URLREWRITE_CREATE_RULELIST (
    'ods_calendar_rule_list1',
    1,
    vector (
                'ods_calendar_rule1',
            'ods_calendar_rule2'
          ));

-- ODS Feeds rules
DB.DBA.URLREWRITE_CREATE_RULELIST (
    'ods_feeds_rule_list1',
    1,
    vector (
                'ods_feeds_rule1',
            'ods_feeds_rule2'
          ));

-- ODS Polls rules
DB.DBA.URLREWRITE_CREATE_RULELIST (
    'ods_polls_rule_list1',
    1,
    vector (
                'ods_polls_rule1',
            'ods_polls_rule2'
          ));

-- All ODS Rules
DB.DBA.URLREWRITE_CREATE_RULELIST ('ods_rule_list1', 1,
        vector(
          'ods_base_rule_list1',
          'ods_foaf_rule_list1',
          'ods_blog_rule_list1',
          'ods_nntp_rule_list1',
          'ods_xd_rule_list1',
          'ods_wiki_rule_list1',
          'ods_photo_rule_list1',
          'ods_addressbook_rule_list1',
          'ods_bookmark_rule_list1',
          'ods_briefcase_rule_list1',
          'ods_calendar_rule_list1',
          'ods_feeds_rule_list1',
          'ods_polls_rule_list1',
          'ods_gems_rule_list1'
              ));

DB.DBA.XML_SET_NS_DECL ('ods', 'http://www.openlinksw.com/virtuoso/ods/', 2);