Hi Boris, I can see the new update method here: https://github.com/neo4j/neo4j-spatial/blob/master/src/main/java/org/neo4j/gis/spatial/server/plugin/SpatialPlugin.java#L138
And the commit for it is here: https://github.com/neo4j/neo4j-spatial/commit/22eaf91957a6265ef1e6923b5da572b75383b83e Hope that helps. Let me know if this works. The REST method is entirely untested, but does wrap code that is tested, so I'm relatively optimistic :-) Regards, Craig On Wed, Jul 6, 2011 at 1:51 AM, Boris Kizelshteyn <bo...@popcha.com> wrote: > Hi Craig, > > This is awesome! > > Where is the update method? I can't find the code on github. > > Thanks! > > On Sat, Jul 2, 2011 at 6:00 PM, Craig Taverner <cr...@amanzi.com> wrote: > > > As I understand it, Andreas is working on the much more complex problem > of > > updating OSM geometries. That is more complex because it involves > > restructuring the connected graph. > > > > The case Boris has is much simpler, just modifying the WKT or WKB in the > > editable layer. In the Java API this is simply to call the > > GeometryEncoder.encodeGeometry() method, which will modify the geometry > in > > place (ie. replace the old geometry with a new one). However, I do not > > think > > it is that simple on the REST interface. I can check, but think we will > > need > > a new method for updating geometries. Internally it is trivial to code. > > > > So I just added a quick method, called updateGeometryFromWKT, which > > requires > > the geometry (in WKT), the existing geometry node-id, and the layer. Give > > it > > a try. > > > > On Sat, Jul 2, 2011 at 5:10 PM, Peter Neubauer <neubauer.pe...@gmail.com > > >wrote: > > > > > Actually, > > > Andreas Wilhelm is working right now on updating geometries. > > > > > > Sent from my phone. > > > On Jul 2, 2011 5:00 PM, "Boris Kizelshteyn" <bo...@popcha.com> wrote: > > > > Wow that's great! I'll try it out asap. This leads to my next > question: > > > how > > > > do I update the geometry in a layer, rather than add new? What I am > > > thinking > > > > of doing is having a multipoint geometery associated with each of my > > user > > > > nodes which will represent their location history. My plan is to add > > the > > > > geometry to a "world" layer and then associate the returned node with > > the > > > > user. How do I then add new points to that connecter node? Can I just > > > edit > > > > the wkt and assume the index will update? Or do you have a better > > > suggestion > > > > for doing this? I would rather avoid having each point be a seperate > > node > > > as > > > > I am tracking gps data and getting lots of coordinates, it would be > > many > > > > thousands of nodes per user. > > > > > > > > Many thanks! > > > > > > > >> > > > >> > > > >> On Sat, Jul 2, 2011 at 6:48 AM, Craig Taverner <cr...@amanzi.com> > > > wrote: > > > >> > > > >>> Hi Boris, > > > >>> > > > >>> Ah! You are using the REST API. That changes a lot, since Neo4j > > Spatial > > > is > > > >>> only recently exposed in REST and we do not expose most of the > > > >>> capabilities > > > >>> I have discussed in this thread, or indeed in my other answer > today. > > > >>> > > > >>> I did recently add some REST methods that might work for you, > > > specifically > > > >>> the addEditableLayer, which makes a WKB layer, and the > > > >>> addGeometryWKTToLayer, for adding any kind of Geometry (including > > > >>> LineString) to the layer. However, these were only added recently, > > and > > > I > > > >>> have no experience using them myself, so consider this very much > > > prototype > > > >>> code. From your other question today, can I assume you are having > > > trouble > > > >>> making sense of the data coming back? So we need a better way to > > return > > > >>> the > > > >>> results in WKT instead of WKB? One option would be to enhance the > > > >>> addEditableLayer method to allow the creation of WKT layers instead > > of > > > WKB > > > >>> layers, so the internal representation is more internet friendly. > > > >>> > > > >>> I've just added untested support for setting the format to WKT for > > the > > > >>> internal representation of the editable layer in the REST > interface. > > > This > > > >>> is > > > >>> untested (outside of my usual unit tests, that is), and is only in > > the > > > >>> trunk > > > >>> of neo4j-spatial, but you are welcome to try it out and see what > > > happens. > > > >>> > > > >>> Regards, Craig > > > >>> > > > >>> On Fri, Jul 1, 2011 at 5:29 PM, Boris Kizelshteyn < > bo...@popcha.com> > > > >>> wrote: > > > >>> > > > >>> > Hi Craig, > > > >>> > > > > >>> > Thanks so much for this reply. It is very insightful. Is it > > possible > > > for > > > >>> me > > > >>> > to implement the LineString geometries and lookups using REST? > > > >>> > > > > >>> > Many thanks! > > > >>> > > > > >>> > On Wed, Jun 8, 2011 at 4:58 PM, Craig Taverner <cr...@amanzi.com > > > > > >>> wrote: > > > >>> > > > > >>> > > OK. I understand much better what you want now. > > > >>> > > > > > >>> > > Your person nodes are not geographic objects, they are persons > > that > > > >>> can > > > >>> > be > > > >>> > > at many positions and indeed move around. However, the 'path' > > that > > > >>> they > > > >>> > > take > > > >>> > > is a geographic object and can be placed on the map and > analysed > > > >>> > > geographically. > > > >>> > > > > > >>> > > So the question I have is how do you store the path the person > > > takes? > > > >>> Is > > > >>> > > this a bunch of position nodes connected back to that person? > Or > > > >>> perhaps > > > >>> > a > > > >>> > > chain of position-(next)->position-(next)->position, etc? > However > > > you > > > >>> > have > > > >>> > > stored this in the graph, you can express this as a geographic > > > object > > > >>> by > > > >>> > > implementing the GeometryEncoder interface. See, for example, > the > > 6 > > > >>> lines > > > >>> > > of > > > >>> > > code it takes to traverse a chain of NEXT locations and produce > a > > > >>> > > LineString > > > >>> > > geometry in the SimpleGraphEncoder at > > > >>> > > > > > >>> > > > > > >>> > > > > >>> > > > > > > > > > https://github.com/neo4j/neo4j-spatial/blob/master/src/main/java/org/neo4j/gis/spatial/encoders/SimpleGraphEncoder.java#L82 > > > >>> > > > > > >>> > > < > > > >>> > > > > > >>> > > > > >>> > > > > > > > > > https://github.com/neo4j/neo4j-spatial/blob/master/src/main/java/org/neo4j/gis/spatial/encoders/SimpleGraphEncoder.java#L82 > > > >>> > > >If > > > >>> > > you do this, you can create a layer that uses your own geometry > > > >>> encoder > > > >>> > (or > > > >>> > > the SimpleGraphEncoder I referenced above, if you use the same > > > graph > > > >>> > > structure) and your own domain model will be expressed as > > > LineString > > > >>> > > geometries and you can perform spatial operations on them. > > > >>> > > > > > >>> > > Alternatively, if your data is more static in nature, and you > are > > > >>> > analysing > > > >>> > > only what the person did in the past, and the graph will > therefor > > > not > > > >>> > > change, perhaps you do not care to store the locations in the > > > graph, > > > >>> and > > > >>> > > you > > > >>> > > can just import them as a LineString directly into a standard > > > layer. > > > >>> > > > > > >>> > > Whatever route you take, the final action you want to perform > is > > to > > > >>> find > > > >>> > > points near the LineString (path the person took). I do not > think > > > the > > > >>> > > bounding box is the right approach for that either. You need to > > > try, > > > >>> for > > > >>> > > example, the method findClosestEdges in the utilities class at > > > >>> > > > > > >>> > > > > > >>> > > > > >>> > > > > > > > > > https://github.com/neo4j/neo4j-spatial/blob/master/src/main/java/org/neo4j/gis/spatial/SpatialTopologyUtils.java#L115 > > > >>> > > > > > >>> > > < > > > >>> > > > > > >>> > > > > >>> > > > > > > > > > https://github.com/neo4j/neo4j-spatial/blob/master/src/main/java/org/neo4j/gis/spatial/SpatialTopologyUtils.java#L115 > > > >>> > > >This > > > >>> > > method can find the part of the persons path that it closest to > > the > > > >>> point > > > >>> > > of > > > >>> > > interest. There also also many other geographic operations you > > > might > > > >>> be > > > >>> > > interested in trying, once you have a better feel for the types > > of > > > >>> > queries > > > >>> > > you want to ask. > > > >>> > > > > > >>> > > Regards, Craig > > > >>> > > > > > >>> > > On Wed, Jun 8, 2011 at 2:17 AM, Boris Kizelshteyn < > > > bo...@popcha.com> > > > >>> > > wrote: > > > >>> > > > > > >>> > > > Thanks for the detailed response! Here is what I'm trying to > do > > > and > > > >>> I'm > > > >>> > > > still not sure how to accomplish it: > > > >>> > > > > > > >>> > > > 1. I have a node which is a person > > > >>> > > > > > > >>> > > > 2. I have geo data as that person moves around the world > > > >>> > > > > > > >>> > > > 3. I use the geodata to create a bounding box of where that > > > person > > > >>> has > > > >>> > > been > > > >>> > > > today > > > >>> > > > > > > >>> > > > 4. I want to say, was this person A near location X today? > > > >>> > > > > > > >>> > > > 5. I do this by seeing if location X is in A's bounding box. > > > >>> > > > > > > >>> > > > From looking at what you suggest doing, it's not clear how I > > > assign > > > >>> the > > > >>> > > > node > > > >>> > > > person A to a layer? Is it that the bounding box is now in > the > > > layer > > > >>> > and > > > >>> > > > not > > > >>> > > > in the node? The issue then becomes, how od I associate the > two > > > as > > > >>> the > > > >>> > > > RTree > > > >>> > > > relationship seems to establish itself on the bounding box > > > between > > > >>> the > > > >>> > > node > > > >>> > > > and the layer. > > > >>> > > > > > > >>> > > > Many thanks for your patience as I learn this challenging > > > material. > > > >>> > > > > > > >>> > > > On Tue, Jun 7, 2011 at 4:13 PM, Craig Taverner < > > cr...@amanzi.com > > > > > > > >>> > wrote: > > > >>> > > > > > > >>> > > > > I think you need to differentiate the bounding boxes of the > > > data > > > >>> in > > > >>> > the > > > >>> > > > > layer (stored in the database), and the bounding box of the > > > search > > > >>> > > query. > > > >>> > > > > The search query is not stored in the database, and will > not > > be > > > >>> seen > > > >>> > as > > > >>> > > a > > > >>> > > > > node or nodes in the database. So if you want to search for > > > data > > > >>> > within > > > >>> > > > > some > > > >>> > > > > bounding box or polygon, then express that in the search > > query, > > > >>> and > > > >>> > you > > > >>> > > > do > > > >>> > > > > not need to care about how your nodes are stored in the > > > database. > > > >>> > > > > > > > >>> > > > > So when you say you want to make a larger bounding box, I > > > assume > > > >>> you > > > >>> > > are > > > >>> > > > > talking about the query itself. The REST API has the method > > > >>> > > > > findGeometriesInLayer, which takes minx, maxx, miny, maxy > > > >>> parameters > > > >>> > > and > > > >>> > > > > you > > > >>> > > > > can set those to whatever you want for your query. > > > >>> > > > > > > > >>> > > > > The REST API also exposes the CQL query language supported > by > > > >>> > GeoTools. > > > >>> > > > > This > > > >>> > > > > allows you to perform SQL-like queries on geometries and > > > feature > > > >>> > > > > attributes. > > > >>> > > > > For example, you can search for all objects within a > specific > > > >>> polygon > > > >>> > > > (not > > > >>> > > > > just a rectangular bounding box), as well as conforming to > > > certain > > > >>> > > > > attributes. See > > > >>> > > > > > > > >>> > > > > > > >>> > > > > > >>> > > > > >>> > > > > > > http://docs.geoserver.org/latest/en/user/tutorials/cql/cql_tutorial.htmlfor > > > >>> > > > > some examples of CQL. > > > >>> > > > > > > > >>> > > > > However, our current CQL support is not fully integrated > with > > > the > > > >>> > RTree > > > >>> > > > > index. This means that the CQL itself will not benefit from > > the > > > >>> > index, > > > >>> > > > but > > > >>> > > > > be a raw search. You can, however, still get the benefit of > > the > > > >>> index > > > >>> > > by > > > >>> > > > > passing in the bounding box separately. So, for example, > you > > > want > > > >>> to > > > >>> > > > search > > > >>> > > > > for data in a polygon. Make the polygon object, get it's > > > bounding > > > >>> box > > > >>> > > and > > > >>> > > > > also the CQL query string. Then make a 'dynamic layer' > using > > > the > > > >>> CQL > > > >>> > > > (which > > > >>> > > > > is a bit like making a prepared statement). Then perform > the > > > same > > > >>> > > > > 'findGeometriesInLayer' method mentioned above, using the > > > bounding > > > >>> > box > > > >>> > > > and > > > >>> > > > > the dynamic layer (containing the CQL). This has the effect > > of > > > >>> using > > > >>> > > the > > > >>> > > > > RTree index for a first approximate search, followed by > pure > > > CQL > > > >>> for > > > >>> > > the > > > >>> > > > > final mile. > > > >>> > > > > > > > >>> > > > > See examples of this in action in the Unit tests in the > > source > > > >>> code. > > > >>> > > > > > > > >>> > > > > > > > >>> > > > > > > >>> > > > > > >>> > > > > >>> > > > > > > > > > https://github.com/neo4j/neo4j-spatial/blob/master/src/test/java/org/neo4j/gis/spatial/ServerPluginTest.java#L109 > > > >>> > > > > has > > > >>> > > > > examples of CQL queries on the REST API. > > > >>> > > > > > > > >>> > > > > On Tue, Jun 7, 2011 at 5:48 PM, Boris Kizelshteyn < > > > >>> bo...@popcha.com> > > > >>> > > > > wrote: > > > >>> > > > > > > > >>> > > > > > Thanks! So it seems you are saying that the bounding box > > > >>> represents > > > >>> > a > > > >>> > > > > > single > > > >>> > > > > > point and is the same as the lat/lat lon? What if I make > > the > > > >>> > bounding > > > >>> > > > box > > > >>> > > > > > bigger? What I am trying to do is geo queries against a > > > bounding > > > >>> > box > > > >>> > > > made > > > >>> > > > > > of > > > >>> > > > > > a set of points, rather than individual points. So the > > query > > > is, > > > >>> > find > > > >>> > > > the > > > >>> > > > > > nodes where the given point falls inside their bounding > > > boxes. > > > >>> Can > > > >>> > I > > > >>> > > do > > > >>> > > > > > this > > > >>> > > > > > with REST? > > > >>> > > > > > > > > >>> > > > > > Thanks! > > > >>> > > > > > > > > >>> > > > > > On Tue, Jun 7, 2011 at 11:34 AM, Craig Taverner < > > > >>> cr...@amanzi.com> > > > >>> > > > > wrote: > > > >>> > > > > > > > > >>> > > > > > > Hi, > > > >>> > > > > > > > > > >>> > > > > > > The bounding boxes are used by the RTree index, which > is > > a > > > >>> > typical > > > >>> > > > way > > > >>> > > > > to > > > >>> > > > > > > index spatial data. For Point data, the lat/long and > the > > > >>> bounding > > > >>> > > box > > > >>> > > > > are > > > >>> > > > > > > the same thing, but for other shapes > (streets/LineString > > > and > > > >>> > > > Polygons), > > > >>> > > > > > the > > > >>> > > > > > > bounding box is quite different to the actual geometry > > > (which > > > >>> is > > > >>> > > not > > > >>> > > > > just > > > >>> > > > > > a > > > >>> > > > > > > single lat/long, but a set of connected points forming > a > > > >>> complex > > > >>> > > > > shape). > > > >>> > > > > > > > > > >>> > > > > > > The RTree does not differentiate between points and > other > > > >>> > > geometries, > > > >>> > > > > > > because it cares only about the bounding box, and > > therefor > > > we > > > >>> > > provide > > > >>> > > > > > that > > > >>> > > > > > > even for something as simple as a Point. > > > >>> > > > > > > > > > >>> > > > > > > Does that answer the question? > > > >>> > > > > > > > > > >>> > > > > > > Regards, Craig > > > >>> > > > > > > > > > >>> > > > > > > On Tue, Jun 7, 2011 at 4:57 PM, Boris Kizelshteyn < > > > >>> > > bo...@popcha.com> > > > >>> > > > > > > wrote: > > > >>> > > > > > > > > > >>> > > > > > > > Greetings! > > > >>> > > > > > > > > > > >>> > > > > > > > Perhaps someone using neo4j-spatial can answer this > > > >>> seemingly > > > >>> > > > simple > > > >>> > > > > > > > question. Nodes classified into layers have both > > lat/lon > > > >>> > > properties > > > >>> > > > > and > > > >>> > > > > > > > bounding boxes, the bounding box seems to be required > > to > > > >>> > > establish > > > >>> > > > > the > > > >>> > > > > > > > relationship between node and layer, however the node > > is > > > not > > > >>> > > found > > > >>> > > > if > > > >>> > > > > > the > > > >>> > > > > > > > lat/lon does not match the query. Can someone explain > > the > > > >>> > > > > relationship > > > >>> > > > > > > > between these two properties on a node? > > > >>> > > > > > > > > > > >>> > > > > > > > Many thanks! > > > >>> > > > > > > > _______________________________________________ > > > >>> > > > > > > > Neo4j mailing list > > > >>> > > > > > > > User@lists.neo4j.org > > > >>> > > > > > > > https://lists.neo4j.org/mailman/listinfo/user > > > >>> > > > > > > > > > > >>> > > > > > > _______________________________________________ > > > >>> > > > > > > Neo4j mailing list > > > >>> > > > > > > User@lists.neo4j.org > > > >>> > > > > > > https://lists.neo4j.org/mailman/listinfo/user > > > >>> > > > > > > > > > >>> > > > > > _______________________________________________ > > > >>> > > > > > Neo4j mailing list > > > >>> > > > > > User@lists.neo4j.org > > > >>> > > > > > https://lists.neo4j.org/mailman/listinfo/user > > > >>> > > > > > > > > >>> > > > > _______________________________________________ > > > >>> > > > > Neo4j mailing list > > > >>> > > > > User@lists.neo4j.org > > > >>> > > > > > > > >>> > > > > > > > >>> > > > _______________________________________________ > > > >>> > > > Neo4j mailing list > > > >>> > > > User@lists.neo4j.org > > > >>> > > > https://lists.neo4j.org/mailman/listinfo/user > > > >>> > > > > > > >>> > > _______________________________________________ > > > >>> > > Neo4j mailing list > > > >>> > > User@lists.neo4j.org > > > >>> > > https://lists.neo4j.org/mailman/listinfo/user > > > >>> > > > > > >>> > _______________________________________________ > > > >>> > Neo4j mailing list > > > >>> > User@lists.neo4j.org > > > >>> > https://lists.neo4j.org/mailman/listinfo/user > > > >>> > > > > >>> _______________________________________________ > > > >>> Neo4j mailing list > > > >>> User@lists.neo4j.org > > > >>> https://lists.neo4j.org/mailman/listinfo/user > > > >>> > > > >> > > > > _______________________________________________ > > > > Neo4j mailing list > > > > User@lists.neo4j.org > > > > https://lists.neo4j.org/mailman/listinfo/user > > > _______________________________________________ > > > Neo4j mailing list > > > User@lists.neo4j.org > > > https://lists.neo4j.org/mailman/listinfo/user > > > > > _______________________________________________ > > Neo4j mailing list > > User@lists.neo4j.org > > https://lists.neo4j.org/mailman/listinfo/user > > > _______________________________________________ > Neo4j mailing list > User@lists.neo4j.org > https://lists.neo4j.org/mailman/listinfo/user > _______________________________________________ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user