Hi,

spatial index creation fails.
I tried to figure the documentation but failed. I can't find the 
jena.spatialindexer to build it manually and the one I specified in my config 
does not work when I use the tdbloader.

Any ideas?


> Am 13.09.2018 um 19:48 schrieb Marco Neumann <[email protected]>:
> 
> to create the spatial index you can take a look at the "Building a Spatial
> Index" section in the "Spatial searches with SPARQL" documentation here
> 
> https://jena.apache.org/documentation/query/spatial-query.html 
> <https://jena.apache.org/documentation/query/spatial-query.html>
> 
> hint: if you don't get results for a spatial filter query that matches your
> data in the database your data isn't spatially indexed correctly. there
> will be no error or the like in the result set though.
> 
> 
> 
> On Thu, Sep 13, 2018 at 1:53 PM Markus Neumann <[email protected] 
> <mailto:[email protected]>>
> wrote:
> 
>> Thanks for the links.
>> 
>> How do I see if the loader does the spatial index? As far as I understood
>> the documentation, my config should produce the spatial index in memory. I
>> haven't figured that part completely though:
>> When I start the database from scratch, the spatial indexing works. After
>> a restart I have to re-upload the stations file (which is no big deal as it
>> is only 593K in size) to regenerate the index.
>> I couldn't get it to work with a persistent index file though.
>> 
>> Right now I'm trying the tdb2.tdbloader (Didn't see that before) and it
>> seems to go even faster:
>> 12:49:11 INFO  loader               :: Add: 41,000,000
>> 2017-01-01_1M_30min.ttl (Batch: 67,980 / Avg: 62,995)
>> 12:49:11 INFO  loader               ::   Elapsed: 650.84 seconds
>> [2018/09/13 12:49:11 UTC]
>> 
>> Is there a way to tell the loader, that he should do the spatial index?
>> 
>> Yes, we have to use the spatial filter eventually, so I would highly
>> appreciate some more informations on the correct setup here.
>> 
>> Many thanks.
>> 
>>> Am 13.09.2018 um 14:19 schrieb Marco Neumann <[email protected]>:
>>> 
>>> :-)
>>> 
>>> this sounds much better Markus. now with regards to the optimizer please
>>> consult the online documentation here:
>>> 
>>> https://jena.apache.org/documentation/tdb/optimizer.html <
>> https://jena.apache.org/documentation/tdb/optimizer.html 
>> <https://jena.apache.org/documentation/tdb/optimizer.html>>
>>> (it's a very simple process to create the stats file and place it in the
>>> directory)
>>> 
>>> also did the loader index the spatial data? do your queries make use of
>> the
>>> spatial filter?
>>> 
>>> On Thu, Sep 13, 2018 at 12:59 PM Markus Neumann <
>> [email protected] <mailto:[email protected]> 
>> <mailto:[email protected] <mailto:[email protected]>>>
>>> wrote:
>>> 
>>>> Marco,
>>>> 
>>>> I just tried the tdbloader2 script with 1 Month of data:
>>>> 
>>>> INFO  Total: 167,385,120 tuples : 1,143.55 seconds : 146,373.23
>> tuples/sec
>>>> [2018/09/13 11:29:31 UTC]
>>>> 11:41:44 INFO Index Building Phase Completed
>>>> 11:41:46 INFO -- TDB Bulk Loader Finish
>>>> 11:41:46 INFO -- 1880 seconds
>>>> 
>>>> Thats already a lot better. I'm working on a way to reduce the amount of
>>>> data by
>>>> Can you give me a pointer on
>>>>> don't forget to run the tdb optimizer to generate the stats.opt file.
>>>> ? I haven't heard of that so far...
>>>> 
>>>> A more general question:
>>>> Would there be a benefit in using the jena stack over using the fuseki
>>>> bundle as I'm doing now? (Documentation was not clear to me on that
>> point)
>>>>       - If so: is there a guide on how to set it up?
>>>> 
>>>> 
>>> fuseki makes use of the jena stack. think of the jena distribution as a
>>> kind of toolbox you can use to work with your different projects in
>>> addition to your fuseki endpoint.
>>> 
>>> just make sure to configure the class path correctly
>>> 
>>> https://jena.apache.org/documentation/tools/index.html 
>>> <https://jena.apache.org/documentation/tools/index.html> <
>> https://jena.apache.org/documentation/tools/index.html 
>> <https://jena.apache.org/documentation/tools/index.html>>
>>> 
>>> Also further to the conversation with Rob, he has a valid point with
>>> regards to data corruption. please do not update of a live tdb database
>>> instance directly with tdbloader while it's connected to a running fuseki
>>> endpoint.
>>> 
>>> shut down the fuseki server first and then run the loader. or run the
>>> loader process in parallel into different target directory and swap the
>>> data or the path again later on. I don't know if there is hot swap option
>>> in fuseki to map to a new directory but a quick restart should do the
>> trick.
>>> 
>>> 
>>> 
>>> 
>>> 
>>>> Thanks and kind regards
>>>> Markus
>>>> 
>>>>> Am 13.09.2018 um 11:56 schrieb Marco Neumann <[email protected] 
>>>>> <mailto:[email protected]>
>>> :
>>>>> 
>>>>> Rob, keeping fuseki live wasn't stated as a requirement for 1. so my
>>>> advise
>>>>> stands. we are running similar updates with fresh data frequently.
>>>>> 
>>>>> Markus, to keep fuseki downtime at a minimum you can pre-populate tdb
>>>> into
>>>>> a temporary directory as well and later switch between directories.
>> don't
>>>>> forget to run the tdb optimizer to generate the stats.opt file.
>>>>> 
>>>>> 
>>>>> On Thu, Sep 13, 2018 at 10:33 AM Rob Vesse <[email protected] 
>>>>> <mailto:[email protected]>>
>> wrote:
>>>>> 
>>>>>> I am not sure tdbloader/tbdloader2 scripts help in this case.  This is
>>>> an
>>>>>> online update of a running Fuseki instance backed by TDB from what has
>>>> been
>>>>>> described.
>>>>>> 
>>>>>> Since a TDB instance can only be safely used by a single JVM at a time
>>>>>> using those scripts would not be a viable option here unless the OP
>> was
>>>>>> willing to stop Fuseki during updates as otherwise it would either
>> fail
>>>>>> (because the built in TDB mechanisms would prevent it) or it would
>> risk
>>>>>> causing data corruption
>>>>>> 
>>>>>> Rob
>>>>>> 
>>>>>> On 13/09/2018, 10:11, "Marco Neumann" <[email protected] 
>>>>>> <mailto:[email protected]>>
>> wrote:
>>>>>> 
>>>>>>  Markus, the tdbloader2 script is part of the apache-jena
>>>> distribution.
>>>>>> 
>>>>>>  let me know how you get on and how this improves your data load
>>>>>> process.
>>>>>> 
>>>>>>  Marco
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>>  On Thu, Sep 13, 2018 at 9:58 AM Markus Neumann <
>>>>>> [email protected] <mailto:[email protected]>>
>>>>>>  wrote:
>>>>>> 
>>>>>>> Hi Marco,
>>>>>>> 
>>>>>>> as this is a project for a customer, I'm afraid we can't make the
>>>>>> data
>>>>>>> public.
>>>>>>> 
>>>>>>> 1. I'm running Fuseki-3.8.0 with the following configuration:
>>>>>>> @prefix :      <http://base/#> .
>>>>>>> @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
>>>>>>> @prefix tdb2:  <http://jena.apache.org/2016/tdb#> .
>>>>>>> @prefix ja:    <http://jena.hpl.hp.com/2005/11/Assembler#> .
>>>>>>> @prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
>>>>>>> @prefix fuseki: <http://jena.apache.org/fuseki#> .
>>>>>>> @prefix spatial: <http://jena.apache.org/spatial#> .
>>>>>>> @prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> .
>>>>>>> @prefix geosparql: <http://www.opengis.net/ont/geosparql#> .
>>>>>>> 
>>>>>>> :service_tdb_all  a                   fuseki:Service ;
>>>>>>>      rdfs:label                    "TDB2 mm" ;
>>>>>>>      fuseki:dataset                :spatial_dataset ;
>>>>>>>      fuseki:name                   "mm" ;
>>>>>>>      fuseki:serviceQuery           "query" , "sparql" ;
>>>>>>>      fuseki:serviceReadGraphStore  "get" ;
>>>>>>>      fuseki:serviceReadWriteGraphStore
>>>>>>>              "data" ;
>>>>>>>      fuseki:serviceUpdate          "update" ;
>>>>>>>      fuseki:serviceUpload          "upload" .
>>>>>>> 
>>>>>>> :spatial_dataset a spatial:SpatialDataset ;
>>>>>>>  spatial:dataset   :tdb_dataset_readwrite ;
>>>>>>>  spatial:index     <#indexLucene> ;
>>>>>>>  .
>>>>>>> 
>>>>>>> <#indexLucene> a spatial:SpatialIndexLucene ;
>>>>>>>  #spatial:directory <file:Lucene> ;
>>>>>>>  spatial:directory "mem" ;
>>>>>>>  spatial:definition <#definition> ;
>>>>>>>  .
>>>>>>> 
>>>>>>> <#definition> a spatial:EntityDefinition ;
>>>>>>>  spatial:entityField      "uri" ;
>>>>>>>  spatial:geoField     "geo" ;
>>>>>>>  # custom geo predicates for 1) Latitude/Longitude Format
>>>>>>>  spatial:hasSpatialPredicatePairs (
>>>>>>>       [ spatial:latitude geo:lat ; spatial:longitude geo:long ]
>>>>>>>       ) ;
>>>>>>>  # custom geo predicates for 2) Well Known Text (WKT) Literal
>>>>>>>  spatial:hasWKTPredicates (geosparql:asWKT) ;
>>>>>>>  # custom SpatialContextFactory for 2) Well Known Text (WKT)
>>>>>> Literal
>>>>>>>  spatial:spatialContextFactory
>>>>>>> #         "com.spatial4j.core.context.jts.JtsSpatialContextFactory"
>>>>>>> 
>>>>>> "org.locationtech.spatial4j.context.jts.JtsSpatialContextFactory"
>>>>>>>  .
>>>>>>> 
>>>>>>> :tdb_dataset_readwrite
>>>>>>>      a              tdb2:DatasetTDB2 ;
>>>>>>>      tdb2:location
>>>>>>> "/srv/linked_data_store/fuseki-server/run/databases/mm" .
>>>>>>> 
>>>>>>> I've been through the Fuseki documentation several times, but I find
>>>>>> it
>>>>>>> still a bit confusing. I would highly appreciate if you could point
>>>>>> me to
>>>>>>> other resources.
>>>>>>> 
>>>>>>> I have not found the tdbloader in the fuseki repo. For now I use a
>>>>>> small
>>>>>>> shell script that wraps curl to upload the data:
>>>>>>> 
>>>>>>> if [ ! -z $2 ]
>>>>>>> then
>>>>>>>  ADD="?graph=http://rdf.meteomatics.com/mm/graphs/$2";
>>>>>>> fi
>>>>>>> curl --basic -u user:password -X POST -F "filename=@$1"
>>>>>>> localhost:3030/mm/data${ADD}
>>>>>>> 
>>>>>>> 2. Our customer has not specified a default use case yet, as the
>>>>>> whole RDF
>>>>>>> concept is about as new to them as it is to me. I suppose it will be
>>>>>>> something like "Find all locations in a certain radius that have nice
>>>>>>> weather next saturday".
>>>>>>> 
>>>>>>> I just took a glance at the ha-fuseki page and will give it a try
>>>>>> later.
>>>>>>> 
>>>>>>> Many thanks for your time
>>>>>>> 
>>>>>>> Best
>>>>>>> Markus
>>>>>>> 
>>>>>>>> Am 13.09.2018 um 10:00 schrieb Marco Neumann <
>>>>>> [email protected]>:
>>>>>>>> 
>>>>>>>> do you make the data endpoint publicly available?
>>>>>>>> 
>>>>>>>> 1. did you try the tdbloader, what version of tdb2 do you use?
>>>>>>>> 
>>>>>>>> 2. many ways to improve your response time here. what does a
>>>>>> typical
>>>>>>> query
>>>>>>>> look like? do you make use of the spatial indexer?
>>>>>>>> 
>>>>>>>> and Andy has a work in progress here for more granular updates
>>>>>> that might
>>>>>>>> be of interest to your effort as well: "High Availablity Apache
>>>>>> Jena
>>>>>>> Fuseki"
>>>>>>>> 
>>>>>>>> https://afs.github.io/rdf-delta/ha-fuseki.html
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On Wed, Sep 12, 2018 at 4:09 PM Markus Neumann <
>>>>>> [email protected]
>>>>>>>> 
>>>>>>>> wrote:
>>>>>>>> 
>>>>>>>>> Hi,
>>>>>>>>> 
>>>>>>>>> we are running a Fuseki server that will hold about 2.2 * 10^9
>>>>>> triples
>>>>>>> of
>>>>>>>>> meteorological data eventually.
>>>>>>>>> I currently run it with "-Xmx80GB" on a 128GB Server. The
>>>>>> database is
>>>>>>> TDB2
>>>>>>>>> on a 900GB SSD.
>>>>>>>>> 
>>>>>>>>> Now I face several performance issues:
>>>>>>>>> 1. Inserting data:
>>>>>>>>>     It takes more than one hour to upload the measurements of
>>>>>> a month
>>>>>>>>> (7.5GB .ttl file ~ 16 Mio triples) (using the data-upload
>>>>>> web-interface
>>>>>>> of
>>>>>>>>> fuseki)
>>>>>>>>>     Is there a way to do this faster?
>>>>>>>>> 2. Updating data:
>>>>>>>>>     We get new model runs 5 times per day. This is data for
>>>>>> the next
>>>>>>>>> 10 days, that needs to be updated every time.
>>>>>>>>>     My idea was to create a named graph "forecast" that holds
>>>>>> the
>>>>>>>>> latest version of this data.
>>>>>>>>>     Every time a new model run arrives, I create a new
>>>>>> temporary
>>>>>>> graph
>>>>>>>>> to upload the data to. Once this is finished, I move the temporary
>>>>>>> graph to
>>>>>>>>> "forecast".
>>>>>>>>>     This seems to do the work twice as it takes 1 hour for the
>>>>>> upload
>>>>>>>>> an 1 hour for the move.
>>>>>>>>> 
>>>>>>>>> Our data consists of the following:
>>>>>>>>> 
>>>>>>>>> Locations (total 1607 -> 16070 triples):
>>>>>>>>> mm-locations:8500015 a mm:Location ;
>>>>>>>>> a geosparql:Geometry ;
>>>>>>>>> owl:sameAs <http://lod.opentransportdata.swiss/didok/8500015>
>>>>>> ;
>>>>>>>>> geosparql:asWKT "POINT(7.61574425031
>>>>>>>>> 47.5425915732)"^^geosparql:wktLiteral ;
>>>>>>>>> mm:station_name "Basel SBB GB Ost" ;
>>>>>>>>> mm:abbreviation "BSGO" ;
>>>>>>>>> mm:didok_id 8500015 ;
>>>>>>>>> geo:lat 47.54259 ;
>>>>>>>>> geo:long 7.61574 ;
>>>>>>>>> mm:elevation 273 .
>>>>>>>>> 
>>>>>>>>> Parameters (total 14 -> 56 triples):
>>>>>>>>> mm-parameters:t_2m:C a mm:Parameter ;
>>>>>>>>> rdfs:label "t_2m:C" ;
>>>>>>>>> dcterms:description "Air temperature at 2m above ground in
>>>>>> degree
>>>>>>>>> Celsius"@en ;
>>>>>>>>> mm:unit_symbol "˚C" .
>>>>>>>>> 
>>>>>>>>> Measurements (that is the huge bunch. Per day: 14 * 1607 * 48 ~ 1
>>>>>> Mio ->
>>>>>>>>> 5Mio triples per day):
>>>>>>>>> mm-measurements:8500015_2018-09-02T00:00:00Z_t_2m:C a
>>>>>> mm:Measurement ;
>>>>>>>>> mm:location mm-locations:8500015 ;
>>>>>>>>> mm:validdate "2018-09-02T00:00:00Z"^^xsd:dateTime ;
>>>>>>>>> mm:value 15.1 ;
>>>>>>>>> mm:parameter mm-parameters:t_2m:C .
>>>>>>>>> 
>>>>>>>>> I would really appreciate if someone could give me some advice on
>>>>>> how to
>>>>>>>>> handle this tasks or point out things I could do to optimize the
>>>>>>>>> organization of the data.
>>>>>>>>> 
>>>>>>>>> Many thanks and kind regards
>>>>>>>>> Markus Neumann
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> --
>>>>>>>> 
>>>>>>>> 
>>>>>>>> ---
>>>>>>>> Marco Neumann
>>>>>>>> KONA
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>>  --
>>>>>> 
>>>>>> 
>>>>>>  ---
>>>>>>  Marco Neumann
>>>>>>  KONA
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>>> --
>>>>> 
>>>>> 
>>>>> ---
>>>>> Marco Neumann
>>>>> KONA
>>>> 
>>>> 
>>> 
>>> --
>>> 
>>> 
>>> ---
>>> Marco Neumann
>>> KONA
>> 
>> 
> 
> -- 
> 
> 
> ---
> Marco Neumann
> KONA

Reply via email to