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.

Reply via email to