Yeah, I think I should do it myself. The case for knn seems more challenging ...
Thanks, Alireza On Wednesday, August 12, 2015 at 9:25:52 PM UTC+2, Craig Taverner wrote: > > Hi Alireza, > > Having two layers is no problem, if you don't mind making and using two. > It could even be faster to query, because the indexes will be smaller. > > You should certainly try the alternative methods for searching for > neighbours, either the one that takes a suggested limit of results to > return, or the one where you provide your own search envelope. Each will > work a little different from the others, and you may find one works best > for you. > > If you know your domain best, you might find that building your own search > window is the best because you will know things the code cannot. > > Regards, Craig > > On Wed, Aug 12, 2015 at 5:32 PM, Alireza Rezaei Mahdiraji < > alire...@gmail.com <javascript:>> wrote: > > > Very well explained, thanks, > > However, one problem with one layer solution is that when I am trying Q2 > and Q3 it > returns also non-point nodes (edge and polygons) which are not part of the > result. > So I think it might be better for me to have two layers. Is there any > performance cost on having several layers? > > Using the two layer approach for query Q2 and Q3 I am not getting the > desired results. For instance for query Q2: > > Node s = dbInstance.findNode(dbLabel, "cid", Integer.parseInt(cellId)); > Geometry geometry = layer.getGeometryEncoder().decodeGeometry(s); > > List<SpatialDatabaseRecord> snodes = GeoPipeline. > startNearestNeighborLatLonSearch(layer, geometry.getCoordinate(), > 1.0).toSpatialDatabaseRecordList(); > > where the coordinates of node s are (0.0, 0.0). It returns only the node > itself. Looking at the source, > it seems startNearestNeighborLatLonSearch builds a window which is much > more smaller. Should I > build my own window and pass to startNearestNeighborLatLonSearch instead > of last param ? > > Similar problem with startNearestNeighborSearch when looking for K > neighbors. > > Cheers, > Thanks, > Alireza > > > > > > On Wednesday, August 12, 2015 at 4:36:35 PM UTC+2, Craig Taverner wrote: > > Hi Alireza, > > Since you have three different geometry types, you are correct to use WKT > (or WKB) for the layer. This layer can handle all three types. You do not > need a separate layer for points. The only reason I suggested making a > points-only layer was that I thought perhaps you only stored points. But > since you store all types, rather have a layer that can handle all. > > The code you have above looks fine and similar to the test code I made. So > it should work fine. The error you had earlier looked like you had tried to > manually create node geometries and add the nodes to the layer, instead of > adding the geometry to the layer. > > One thing I find a little strange above is that you have chosen to use an > encoder config with three fields "x:y:z". But the WKB and WKT encoders only > understand two. The first is the geometry property name (you chose "x" to > hold the geometry in the node), and the second is the bbox property. I > think it a little confusing to store a whole polygon in "x" and to store > the envelope(bbox) in "y". I'm guessing this is not what you intended to > do? I advise you rather pass a single string with no ':' separators, like > 'my_geom'. Better yet, leave it empty and get the default value. In fact > you can leave off all fields but the layer name, if you use the method > getOrCreateEditableLayer(name). > > Here is a section of the test code I tried, which worked, and adds a Point > and LineString to the layer: > > SpatialDatabaseService db = new SpatialDatabaseService( graphDb() ); > String layerName = "myLayer"; > String geomPropertyName = "my_geom"; > EditableLayer layer = (EditableLayer) db.getOrCreateLayer( layerName, > WKBGeometryEncoder.class, > EditableLayerImpl.class, > geomPropertyName ); > GeometryFactory gf = layer.getGeometryFactory(); > SpatialDatabaseRecord record = layer.add( gf.createPoint( new Coordinate( > 15.25, 56.15 ) ) ); > LinearRing ring = gf.createLinearRing( new Coordinate[]{ > new Coordinate( 15.3, 56.2 ), > new Coordinate( 15.4, 56.2 ), > new Coordinate( 15.4, 56.3 ), > new Coordinate( 15.3, 56.3 ), > new Coordinate( 15.3, 56.2 ) > } ); > Polygon polygon = gf.createPolygon( ring, null ); > record = layer.add( polygon ); > > You can use WKB or WKT for this layer. Note that if you created a layer > with simply: > > db.getOrCreateEditableLayer( layerName ); > > Then you get a WKB layer with default configs. > > Regards, Craig > > > On Wed, Aug 12, 2015 at 4:01 PM, Alireza Rezaei Mahdiraji < > alire...@gmail.com> wrote: > > > Hi Craig, > > As always thanks for your nice reply. > > I understood the problem but not the solution yet. The fact is I have > points, lines, and polygons as geometries. > Four main queries which I have are as follows: > > 1- given coordinates of an arbitrary point (i.e., not a node in the graph) > find the polygon node which enclose it > > 2- given a point node find all other nodes which are withing distance r of > it. > > 3- given a point node find all k nearest neighbors point node of it > > 4- given two polygon determines if they intersect and perhaps find the > size of intersection > > I defined my layer as follows (I tried with WKB too): > > EditableLayer runningLayer = (EditableLayer) > graphDBSpatial.getOrCreateLayer(layerName, > WKTGeometryEncoder.class, > EditableLayerImpl.class, > "x:y:z"); > > Then I create my nodes as follows: > > // point node > Point p = runningLayer.getGeometryFactory().createPoint(coord); > SpatialDatabaseRecord v = runningLayer.add(p); > > // edge node > LineString lineString = > runningLayer.getGeometryFactory().createLineString(coord); > SpatialDatabaseRecord e = runningLayer.add(lineString); > > // polygon node > Polygon poly = > runningLayer.getGeometryFactory().createPolygon(coordinates); > SpatialDatabaseRecord tc = runningLayer.add(poly); > > Based on what you said I should have a separate layer for point, right? If > the answer is yes, then while querying I should load two layers > based on which of the queries above is requested (WKT layer for queries 1 > and 4 and Point layer for 2 and 3), is that correct ? > > Cheers, > Alireza > > On Monday, August 10, 2015 at 11:09:21 AM UTC+2, Craig Taverner wrote: > > Hi Alireza, > > I wrote some test code using your layer creation and neighbour search code > that you pasted, and it works fine. So what I think has happened is that > you have somehow added nodes with a different layer config to the same > index that you are now using for WKB. Perhaps the nodes used to be points > in a simple point layer, and now you changed to a WKB layer, it is no > longer compatible. > > I can make a few suggestions: > > - Make sure your nodes were added using the layer.add(Geometry) > method. If you used layer.add(Node) then it is your responsibility to make > sure the node conforms to the same layer config that you are planning to > use. For example, do not add a simple point node (with lat/lon attributes) > to a WKT layer, or you are likely to create this kind of issue. > - Since you are working with points, can I suggest you not use the WKB > layer config, but rather use the SimplePointLayer, as created by > SpatialGraphDatabase.createSimplePointLayer(name) > or SpatialGraphDatabase.createSimplePointLayer(name,xProp,yProp) > > Regards, Craig > > On Sun, Aug 9, 2015 at 12:02 AM, Alireza Rezaei Mahdiraji < > alire...@gmail.com> wrote: > > > Let me ask you a design kind of question: the nodes in my graph could have > various geometry: point, line, or polygon. > I used the following layer definition (but I am not sure that is the best > way to do it)" > > EditableLayer runningLayer = (EditableLayer) > graphDBSpatial.getOrCreateLayer(layerName, > WKBGeometryEncoder.class, > EditableLayerImpl.class, > geomEncoderConfig); > > I appreciate if you comment on this. > > Alireza > > > On Saturday, August 8, 2015 at 11:48:24 PM UTC+2, Michael Hunger wrote: > > It seems you created the layer with a WKB (well known binary) > representation config > > but now your location properties are not decodable as WKB because they are > double's ? > > Michael > > Perhaps you can share a test that reproduces the issue? > > Am 08.08.2015 um 23:26 schrieb Alireza Rezaei Mahdiraji < > alire...@gmail.com>: > > > Here are the stacks for the two cases (very similar): > > Exception in thread "main" java.lang.ClassCastException: java.lang.Double > cannot be cast to [B > at > org.neo4j.gis.spatial.WKBGeometryEncoder.decodeGeometry(WKBGeometryEncoder.java:41) > at > org.neo4j.gis.spatial.filter.SearchIntersectWindow.onEnvelopeIntersection(SearchIntersectWindow.java:48) > at > org.neo4j.gis.spatial.rtree.filter.AbstractSearchEnvelopeIntersection.geometryMatches(AbstractSearchEnvelopeIntersection.java:45) > at > org.neo4j.gis.spatial.rtree.RTreeIndex$SearchEvaluator.checkPosition(RTreeIndex.java:286) > at > org.neo4j.gis.spatial.rtree.RTreeIndex$SearchEvaluator.isStopNode(RTreeIndex.java:299) > at > org.neo4j.kernel.impl.traversal.OldTraverserWrapper$Pruner.evaluate(OldTraverserWrapper.java:260) > at > org.neo4j.graphdb.traversal.Evaluator$AsPathEvaluator.evaluate(Evaluator.java:69) > at > org.neo4j.kernel.impl.traversal.MultiEvaluator.evaluate(MultiEvaluator.java:62) > at > org.neo4j.kernel.impl.traversal.MonoDirectionalTraverserIterator.evaluate(MonoDirectionalTraverserIterator.java:61) > at > org.neo4j.kernel.impl.traversal.TraversalBranchImpl.evaluate(TraversalBranchImpl.java:125) > at > org.neo4j.kernel.impl.traversal.TraversalBranchImpl.initialize(TraversalBranchImpl.java:130) > at > org.neo4j.kernel.impl.traversal.TraversalBranchImpl.next(TraversalBranchImpl.java:151) > at > org.neo4j.kernel.impl.traversal.TraversalBranchWithState.next(TraversalBranchWithState.java:32) > at > org.neo4j.kernel.impl.traversal.StartNodeTraversalBranch.next(StartNodeTraversalBranch.java:50) > at > org.neo4j.graphdb.traversal.PreorderDepthFirstSelector.next(PreorderDepthFirstSelector.java:49) > at > org.neo4j.kernel.impl.traversal.MonoDirectionalTraverserIterator.fetchNextOrNull(MonoDirectionalTraverserIterator.java:70) > at > org.neo4j.kernel.impl.traversal.MonoDirectionalTraverserIterator.fetchNextOrNull(MonoDirectionalTraverserIterator.java:36) > at > org.neo4j.helpers.collection.PrefetchingIterator.peek(PrefetchingIterator.java:60) > at > org.neo4j.helpers.collection.PrefetchingIterator.hasNext(PrefetchingIterator.java:46) > at > org.neo4j.helpers.collection.PrefetchingIterator.next(PrefetchingIterator.java:75) > at > org.neo4j.kernel.impl.traversal.OldTraverserWrapper$TraverserImpl.next(OldTraverserWrapper.java:86) > at > org.neo4j.kernel.impl.traversal.OldTraverserWrapper$TraverserImpl.next(OldTraverserWrapper.java:47) > at > org.neo4j.gis.spatial.filter.SearchRecords.next(SearchRecords.java:53) > at > org.neo4j.gis.spatial.filter.SearchRecords.next(SearchRecords.java:29) > at org.neo4j.gis.spatial.pipes.GeoPipeline$1.next(GeoPipeline.java:134) > at org.neo4j.gis.spatial.pipes.GeoPipeline$1.next(GeoPipeline.java:126) > at > org.neo4j.gis.spatial.pipes.impl.LastElementIterator.next(LastElementIterator.java:19) > at > org.neo4j.gis.spatial.pipes.impl.IdentityPipe.processNextStart(IdentityPipe.java:18) > at > org.neo4j.gis.spatial.pipes.impl.AbstractPipe.next(AbstractPipe.java:72) > at > org.neo4j.gis.spatial.pipes.AbstractGeoPipe.processNextStart(AbstractGeoPipe.java:49) > at > org.neo4j.gis.spatial.pipes.AbstractGeoPipe.processNextStart(AbstractGeoPipe.java:31) > at > org.neo4j.gis.spatial.pipes.impl.AbstractPipe.next(AbstractPipe.java:72) > at org.neo4j.gis.spatial.pipes.impl.Pipeline.next(Pipeline.java:113) > at > org.neo4j.gis.spatial.pipes.GeoPipeline.toNodeList(GeoPipeline.java:1015) > > > Exception in thread "main" java.lang.ClassCastException: java.lang.Double > cannot be cast to [B > at > org.neo4j.gis.spatial.WKBGeometryEncoder.decodeGeometry(WKBGeometryEncoder.java:41) > at > org.neo4j.gis.spatial.filter.SearchIntersectWindow.onEnvelopeIntersection(SearchIntersectWindow.java:48) > at > org.neo4j.gis.spatial.rtree.filter.AbstractSearchEnvelopeIntersection.geometryMatches(AbstractSearchEnvelopeIntersection.java:45) > at > org.neo4j.gis.spatial.rtree.RTreeIndex$SearchEvaluator.checkPosition(RTreeIndex.java:286) > at > org.neo4j.gis.spatial.rtree.RTreeIndex$SearchEvaluator.isStopNode(RTreeIndex.java:299) > at > org.neo4j.kernel.impl.traversal.OldTraverserWrapper$Pruner.evaluate(OldTraverserWrapper.java:260) > at > org.neo4j.graphdb.traversal.Evaluator$AsPathEvaluator.evaluate(Evaluator.java:69) > > ... -- You received this message because you are subscribed to the Google Groups "Neo4j" group. To unsubscribe from this group and stop receiving emails from it, send an email to neo4j+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.