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 <javascript:>> 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)
>>>>>     at 
>>>>> org.neo4j.kernel.impl.traversal.MultiEvaluator.evaluate(MultiEvaluator.java:62)
>>>>>     at 
>>>>> org.neo4j.kernel.impl.traversal.MonoDirectionalTraverserIterator.evaluate(MonoDirectionalTraverserIterator.ja
>>>>>
>>>>> ...
>>>>
>>>> -- 
>>>> 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+un...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>> -- 
>> 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+un...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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