You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Osma Suominen <os...@aalto.fi> on 2012/11/02 14:08:51 UTC

Fuseki/TDB and namespace prefixes

Hi,

I'm trying to have Fuseki serve whole graphs with the SPARQL HTTP Graph 
Store Protocol, i.e. it should respond to HTTP GETs using a URL such as 
/ds/data?graph=http://example.org/my-graph

It does give me the data, but it will not give me the right namespace 
prefixes. In previous correspondence about namespace prefixes on the 
list [1] and elsewhere [2] it has been said that TDB will pick up 
prefixes from the data, but I can't get that to work. Fuseki will only 
give me prefixes such as j.0.

I'm using jena-fuseki-0.2.6-SNAPSHOT from a few days ago.

I've tried three different ways of setting up Fuseki and loading the 
data. I'm using the Fuseki stock config.ttl file as a test data set, 
because it contains several namespace prefixes such as fuseki: and tdb:.

A: In-memory model loaded directly from the file at startup:
./fuseki-server --file config.ttl /ds

B: In-memory model updated via HTTP PUT:
./fuseki-server --update --mem /ds
./s-put http://localhost:3030/ds/data default config.ttl

C: File-backed model updated via HTTP PUT:
mkdir DS
./fuseki-server --update --loc DS /ds
./s-put http://localhost:3030/ds/data default config.ttl

After each of these, I've tried accessing the graph at 
http://localhost:3030/ds/data?graph=default
I get back the triples, but not the correct namespace prefixes, like this:

--snip--
<rdf:RDF
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:j.0="http://jena.hpl.hp.com/2005/11/Assembler#"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:j.1="http://jena.apache.org/fuseki#" >
   <rdf:Description 
rdf:about="http://localhost:3030/ds/data?default#emptyDataset">
     <rdf:type 
rdf:resource="http://jena.hpl.hp.com/2005/11/Assembler#RDFDataset"/>
   </rdf:Description>
--snip-- (omitted the remaining data)

My question is, isn't Fuseki/TDB supposed to pick up the prefixes, store 
them in the in-memory or TDB store, and then use them in the reply to 
the HTTP GET request? Why isn't that happening?

-Osma

[1] 
http://mail-archives.apache.org/mod_mbox/jena-users/201108.mbox/%3C4E40F3B5.3020500@epimorphics.com%3E
[2] http://tech.groups.yahoo.com/group/jena-dev/message/47330

-- 
Osma Suominen | Osma.Suominen@aalto.fi | +358 40 5255 882
Aalto University, Department of Media Technology, Semantic Computing 
Research Group
Room 2541, Otaniementie 17, Espoo, Finland; P.O. Box 15500, FI-00076 
Aalto, Finland

Re: Fuseki/TDB and namespace prefixes

Posted by Andy Seaborne <an...@apache.org>.
As Martynas says, prefixes are just surface syntax.  In fact,
you can add some prefixes into the data retrieved (in the client, using 
Java) if that makes the presentation better.

There is an additional reason (see JENA-309).  Data loaded via the HTTP 
operations gets parsed to a temporary graph then triples from the graph 
are put into the database.  This looses the namespace declarations.

It would be nice to manage namespaces a bit better but any systematic 
approach needs to cope systematically with (1) two declarations for the 
same URI (particularly likely if combining data from several places) and 
(2) redefinition of a prefix to a different URI.

The operation to add one graph into another could be made to also merge 
in namespaces.

TopQuadrant do some namespace-sensitive stuff.  Maybe they would like to 
comment.

	Andy


On 02/11/12 15:37, Martynas Jusevičius wrote:
> Hey Osma,
>
> if I understand your question right: there are no "correct" namespace
> prefixes since those are only syntactic shorthands for full
> namespaces. The following are equivalent because they refer to the
> same namespace:
>
> xmlns:j.0="http://jena.hpl.hp.com/2005/11/Assembler#"
> xmlns:asm="http://jena.hpl.hp.com/2005/11/Assembler#"
> xmlns:xxx="http://jena.hpl.hp.com/2005/11/Assembler#"
>
> or alternatively in Turtle syntax:
>
> @prefix j.0: <http://jena.hpl.hp.com/2005/11/Assembler#>
> @prefix asm: <http://jena.hpl.hp.com/2005/11/Assembler#>
> @prefix xxx: <http://jena.hpl.hp.com/2005/11/Assembler#>
>
> It follows from the above that the following are equivalent:
>
> j.0:RDFDataset == asm:RDFDataset == xxx:RDFDataset
>
> This applies to XML namespaces as well, but especially with RDF you
> should be thinking in absolute URIs rather than prefixes/names.
>
> So my guess is that the result you're getting is correct and
> equivalent to your input -- even if the serialization differs.
>
> Martynas
> graphity.org
>
> On Fri, Nov 2, 2012 at 3:08 PM, Osma Suominen <os...@aalto.fi> wrote:
>> Hi,
>>
>> I'm trying to have Fuseki serve whole graphs with the SPARQL HTTP Graph
>> Store Protocol, i.e. it should respond to HTTP GETs using a URL such as
>> /ds/data?graph=http://example.org/my-graph
>>
>> It does give me the data, but it will not give me the right namespace
>> prefixes. In previous correspondence about namespace prefixes on the list
>> [1] and elsewhere [2] it has been said that TDB will pick up prefixes from
>> the data, but I can't get that to work. Fuseki will only give me prefixes
>> such as j.0.
>>
>> I'm using jena-fuseki-0.2.6-SNAPSHOT from a few days ago.
>>
>> I've tried three different ways of setting up Fuseki and loading the data.
>> I'm using the Fuseki stock config.ttl file as a test data set, because it
>> contains several namespace prefixes such as fuseki: and tdb:.
>>
>> A: In-memory model loaded directly from the file at startup:
>> ./fuseki-server --file config.ttl /ds
>>
>> B: In-memory model updated via HTTP PUT:
>> ./fuseki-server --update --mem /ds
>> ./s-put http://localhost:3030/ds/data default config.ttl
>>
>> C: File-backed model updated via HTTP PUT:
>> mkdir DS
>> ./fuseki-server --update --loc DS /ds
>> ./s-put http://localhost:3030/ds/data default config.ttl
>>
>> After each of these, I've tried accessing the graph at
>> http://localhost:3030/ds/data?graph=default
>> I get back the triples, but not the correct namespace prefixes, like this:
>>
>> --snip--
>> <rdf:RDF
>>      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>>      xmlns:j.0="http://jena.hpl.hp.com/2005/11/Assembler#"
>>      xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>>      xmlns:j.1="http://jena.apache.org/fuseki#" >
>>    <rdf:Description
>> rdf:about="http://localhost:3030/ds/data?default#emptyDataset">
>>      <rdf:type
>> rdf:resource="http://jena.hpl.hp.com/2005/11/Assembler#RDFDataset"/>
>>    </rdf:Description>
>> --snip-- (omitted the remaining data)
>>
>> My question is, isn't Fuseki/TDB supposed to pick up the prefixes, store
>> them in the in-memory or TDB store, and then use them in the reply to the
>> HTTP GET request? Why isn't that happening?
>>
>> -Osma
>>
>> [1]
>> http://mail-archives.apache.org/mod_mbox/jena-users/201108.mbox/%3C4E40F3B5.3020500@epimorphics.com%3E
>> [2] http://tech.groups.yahoo.com/group/jena-dev/message/47330
>>
>> --
>> Osma Suominen | Osma.Suominen@aalto.fi | +358 40 5255 882
>> Aalto University, Department of Media Technology, Semantic Computing
>> Research Group
>> Room 2541, Otaniementie 17, Espoo, Finland; P.O. Box 15500, FI-00076 Aalto,
>> Finland


Re: Fuseki/TDB and namespace prefixes

Posted by Osma Suominen <os...@aalto.fi>.
Hi Andy and Martynas,

thanks for your quick answers. I know namespaces are just surface 
syntax, but I like to have them "correct" regardless. My reason is that 
I'd like to expose the graph store to the public (read-only) so that 
anyone can "download" datasets directly from the triple store, instead 
of me having to provide file dumps which will likely be out of date 
anyway. There are a lot of established conventions on what namespaces to 
use in RDF data (see prefix.cc) and using them makes the data more easy 
to grasp for humans.

Anyway, I tried to get round the problem of losing namespaces in HTTP 
update operations that Andy mentioned, so I used tdbloader instead to 
first load the data into TDB, like this:

cd jena-fuseki-0.2.6-SNAPSHOT
mkdir DS
../apache-jena-2.7.4/bin/tdbloader --loc=DS config.ttl
./fuseki-server --loc=DS /ds

Now when I access the graph store at 
http://localhost:3030/ds/data?graph=default I still get prefixes like 
j.0 and j.1 instead of the ones defined in config.ttl. I also tried to 
load an RDF/XML file just in case this is Turtle-specific, but the 
result was the same. Also I tried a DESCRIBE query through SPARQL in 
case this is specific to the HTTP graph store protocol, but again Fuseki 
gives me j.0 and j.1.

What am I doing wrong this time?

-Osma


02.11.2012 22:38, Andy Seaborne kirjoitti:
>
> As Martynas says, prefixes are just surface syntax.  In fact,
> you can add some prefixes into the data retrieved (in the client, using
> Java) if that makes the presentation better.
>
> There is an additional reason (see JENA-309).  Data loaded via the HTTP
> operations gets parsed to a temporary graph then triples from the graph
> are put into the database.  This looses the namespace declarations.
>
> It would be nice to manage namespaces a bit better but any systematic
> approach needs to cope systematically with (1) two declarations for the
> same URI (particularly likely if combining data from several places) and
> (2) redefinition of a prefix to a different URI.
>
> The operation to add one graph into another could be made to also merge
> in namespaces.
>
> TopQuadrant do some namespace-sensitive stuff.  Maybe they would like to
> comment.
>
> 	Andy
>
>
> On 02/11/12 15:37, Martynas Jusevičius wrote:
>> Hey Osma,
>>
>> if I understand your question right: there are no "correct" namespace
>> prefixes since those are only syntactic shorthands for full
>> namespaces. The following are equivalent because they refer to the
>> same namespace:
>>
>> xmlns:j.0="http://jena.hpl.hp.com/2005/11/Assembler#"
>> xmlns:asm="http://jena.hpl.hp.com/2005/11/Assembler#"
>> xmlns:xxx="http://jena.hpl.hp.com/2005/11/Assembler#"
>>
>> or alternatively in Turtle syntax:
>>
>> @prefix j.0: <http://jena.hpl.hp.com/2005/11/Assembler#>
>> @prefix asm: <http://jena.hpl.hp.com/2005/11/Assembler#>
>> @prefix xxx: <http://jena.hpl.hp.com/2005/11/Assembler#>
>>
>> It follows from the above that the following are equivalent:
>>
>> j.0:RDFDataset == asm:RDFDataset == xxx:RDFDataset
>>
>> This applies to XML namespaces as well, but especially with RDF you
>> should be thinking in absolute URIs rather than prefixes/names.
>>
>> So my guess is that the result you're getting is correct and
>> equivalent to your input -- even if the serialization differs.
>>
>> Martynas
>> graphity.org
>>
>> On Fri, Nov 2, 2012 at 3:08 PM, Osma Suominen <os...@aalto.fi> wrote:
>>> Hi,
>>>
>>> I'm trying to have Fuseki serve whole graphs with the SPARQL HTTP Graph
>>> Store Protocol, i.e. it should respond to HTTP GETs using a URL such as
>>> /ds/data?graph=http://example.org/my-graph
>>>
>>> It does give me the data, but it will not give me the right namespace
>>> prefixes. In previous correspondence about namespace prefixes on the list
>>> [1] and elsewhere [2] it has been said that TDB will pick up prefixes from
>>> the data, but I can't get that to work. Fuseki will only give me prefixes
>>> such as j.0.
>>>
>>> I'm using jena-fuseki-0.2.6-SNAPSHOT from a few days ago.
>>>
>>> I've tried three different ways of setting up Fuseki and loading the data.
>>> I'm using the Fuseki stock config.ttl file as a test data set, because it
>>> contains several namespace prefixes such as fuseki: and tdb:.
>>>
>>> A: In-memory model loaded directly from the file at startup:
>>> ./fuseki-server --file config.ttl /ds
>>>
>>> B: In-memory model updated via HTTP PUT:
>>> ./fuseki-server --update --mem /ds
>>> ./s-put http://localhost:3030/ds/data default config.ttl
>>>
>>> C: File-backed model updated via HTTP PUT:
>>> mkdir DS
>>> ./fuseki-server --update --loc DS /ds
>>> ./s-put http://localhost:3030/ds/data default config.ttl
>>>
>>> After each of these, I've tried accessing the graph at
>>> http://localhost:3030/ds/data?graph=default
>>> I get back the triples, but not the correct namespace prefixes, like this:
>>>
>>> --snip--
>>> <rdf:RDF
>>>       xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>>>       xmlns:j.0="http://jena.hpl.hp.com/2005/11/Assembler#"
>>>       xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>>>       xmlns:j.1="http://jena.apache.org/fuseki#" >
>>>     <rdf:Description
>>> rdf:about="http://localhost:3030/ds/data?default#emptyDataset">
>>>       <rdf:type
>>> rdf:resource="http://jena.hpl.hp.com/2005/11/Assembler#RDFDataset"/>
>>>     </rdf:Description>
>>> --snip-- (omitted the remaining data)
>>>
>>> My question is, isn't Fuseki/TDB supposed to pick up the prefixes, store
>>> them in the in-memory or TDB store, and then use them in the reply to the
>>> HTTP GET request? Why isn't that happening?
>>>
>>> -Osma
>>>
>>> [1]
>>> http://mail-archives.apache.org/mod_mbox/jena-users/201108.mbox/%3C4E40F3B5.3020500@epimorphics.com%3E
>>> [2] http://tech.groups.yahoo.com/group/jena-dev/message/47330
>>>
>>> --
>>> Osma Suominen | Osma.Suominen@aalto.fi | +358 40 5255 882
>>> Aalto University, Department of Media Technology, Semantic Computing
>>> Research Group
>>> Room 2541, Otaniementie 17, Espoo, Finland; P.O. Box 15500, FI-00076 Aalto,
>>> Finland
>


-- 
Osma Suominen | Osma.Suominen@aalto.fi | +358 40 5255 882
Aalto University, Department of Media Technology, Semantic Computing 
Research Group
Room 2541, Otaniementie 17, Espoo, Finland; P.O. Box 15500, FI-00076 
Aalto, Finland

Re: Fuseki/TDB and namespace prefixes

Posted by Martynas Jusevičius <ma...@graphity.org>.
Hey Osma,

if I understand your question right: there are no "correct" namespace
prefixes since those are only syntactic shorthands for full
namespaces. The following are equivalent because they refer to the
same namespace:

xmlns:j.0="http://jena.hpl.hp.com/2005/11/Assembler#"
xmlns:asm="http://jena.hpl.hp.com/2005/11/Assembler#"
xmlns:xxx="http://jena.hpl.hp.com/2005/11/Assembler#"

or alternatively in Turtle syntax:

@prefix j.0: <http://jena.hpl.hp.com/2005/11/Assembler#>
@prefix asm: <http://jena.hpl.hp.com/2005/11/Assembler#>
@prefix xxx: <http://jena.hpl.hp.com/2005/11/Assembler#>

It follows from the above that the following are equivalent:

j.0:RDFDataset == asm:RDFDataset == xxx:RDFDataset

This applies to XML namespaces as well, but especially with RDF you
should be thinking in absolute URIs rather than prefixes/names.

So my guess is that the result you're getting is correct and
equivalent to your input -- even if the serialization differs.

Martynas
graphity.org

On Fri, Nov 2, 2012 at 3:08 PM, Osma Suominen <os...@aalto.fi> wrote:
> Hi,
>
> I'm trying to have Fuseki serve whole graphs with the SPARQL HTTP Graph
> Store Protocol, i.e. it should respond to HTTP GETs using a URL such as
> /ds/data?graph=http://example.org/my-graph
>
> It does give me the data, but it will not give me the right namespace
> prefixes. In previous correspondence about namespace prefixes on the list
> [1] and elsewhere [2] it has been said that TDB will pick up prefixes from
> the data, but I can't get that to work. Fuseki will only give me prefixes
> such as j.0.
>
> I'm using jena-fuseki-0.2.6-SNAPSHOT from a few days ago.
>
> I've tried three different ways of setting up Fuseki and loading the data.
> I'm using the Fuseki stock config.ttl file as a test data set, because it
> contains several namespace prefixes such as fuseki: and tdb:.
>
> A: In-memory model loaded directly from the file at startup:
> ./fuseki-server --file config.ttl /ds
>
> B: In-memory model updated via HTTP PUT:
> ./fuseki-server --update --mem /ds
> ./s-put http://localhost:3030/ds/data default config.ttl
>
> C: File-backed model updated via HTTP PUT:
> mkdir DS
> ./fuseki-server --update --loc DS /ds
> ./s-put http://localhost:3030/ds/data default config.ttl
>
> After each of these, I've tried accessing the graph at
> http://localhost:3030/ds/data?graph=default
> I get back the triples, but not the correct namespace prefixes, like this:
>
> --snip--
> <rdf:RDF
>     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>     xmlns:j.0="http://jena.hpl.hp.com/2005/11/Assembler#"
>     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>     xmlns:j.1="http://jena.apache.org/fuseki#" >
>   <rdf:Description
> rdf:about="http://localhost:3030/ds/data?default#emptyDataset">
>     <rdf:type
> rdf:resource="http://jena.hpl.hp.com/2005/11/Assembler#RDFDataset"/>
>   </rdf:Description>
> --snip-- (omitted the remaining data)
>
> My question is, isn't Fuseki/TDB supposed to pick up the prefixes, store
> them in the in-memory or TDB store, and then use them in the reply to the
> HTTP GET request? Why isn't that happening?
>
> -Osma
>
> [1]
> http://mail-archives.apache.org/mod_mbox/jena-users/201108.mbox/%3C4E40F3B5.3020500@epimorphics.com%3E
> [2] http://tech.groups.yahoo.com/group/jena-dev/message/47330
>
> --
> Osma Suominen | Osma.Suominen@aalto.fi | +358 40 5255 882
> Aalto University, Department of Media Technology, Semantic Computing
> Research Group
> Room 2541, Otaniementie 17, Espoo, Finland; P.O. Box 15500, FI-00076 Aalto,
> Finland