Hi Craig, 

Thanks a lot for elaborate answer. 

The snippet from you by changing to WK encoder seems to work. 
A related question in this case is (I do not know if I should send it as a 
separate post or not):

I want to build a graph out of the result of this query, is there any such 
solution already in Neo4j, i.e., to recieve a query result as yet another 
graph not 
just a list of node? 

Thanks,
Alireza

On Thursday, September 11, 2014 2:31:06 PM UTC+2, Craig Taverner wrote:
>
> Switching to WKT or WKB like this means that your cases will work, because 
> you now have an index that understands Point, LineString and Polygon 
> correctly. This is the easiest solution to your immediate needs.
>
> The only option that might be better was the one I suggested in a previous 
> email, where you create your own GeometryEncoder class that can, for 
> example, allow the same Point node to also be part of the LineString 
> geometry. This will allow you to analyse your data in a more graphy way, 
> but does require that you really know what you are doing. It should be 
> considered 'advanced' usage of the spatial library.
>
>
> On Tue, Sep 9, 2014 at 5:51 PM, Alireza Rezaei Mahdiraji <
> [email protected] <javascript:>> wrote:
>
>>
>> My layer was defined using SimplePointEncoder.class but I changed to WTK:
>>
>> runningLayer = (EditableLayer) 
>>                 graphDBSpatial.getOrCreateLayer(layerName, 
>>                     WKBGeometryEncoder.class, 
>>                         EditableLayerImpl.class, 
>>                             geomEncoderConfig);   
>>
>> This works fine, i.e., for the envelope it returns only one object which 
>> is a vertex, 
>> I tried another envelope (0.5,1.5, - 0.5,1.5) and it works fine too 
>> (returns three objects which is correct).
>>
>> However, I am not sure if my definition of layer is correct. 
>>
>> Best,
>> Alireza
>>
>>
>> On Tuesday, September 9, 2014 1:23:44 PM UTC+2, Craig Taverner wrote:
>>>
>>> Hi Alireza,
>>>
>>> I opened your graph in the neo4j server and looked around, and then also 
>>> write some Java test code (based on your snippet) to see what I could see. 
>>> The main conclusion is that I see two nodes (not one) that are in the 
>>> envelope, nodes with n.id=2 and n.id=10.
>>>
>>> I've attached screenshots of the Neo4j browser looking at the data, a 
>>> graph view showing the nodes and the spatial layer connected to them, and a 
>>> cypher query that lists the key properties. The cypher query I used was:
>>>
>>> MATCH (n) WHERE has(n.gtype) RETURN id(n), n.id, n.gtype, n.x, n.y, 
>>> n.bbox, n.dim, n.eid
>>>
>>>
>>> Some interesting points I can see:
>>>
>>>    - There are definitely two nodes with x=1, y=1 which should be 
>>>    inside Envelope(0.5,1.5,0.5,1.5).
>>>    - The use of a property 'id' is allowed, but a little confusing 
>>>    because it is easy to think that might be the node id (see that I'm 
>>> listing 
>>>    the node id and the node property 'id' just to be clear)
>>>    - I'm surprised by the fact that there are three different gtype 
>>>    values: 1, 2, 3, which mean POINT, LINESTRING, POLYGON respectively, but 
>>>    clearly these are all points (they have only x,y information). This 
>>> means 
>>>    that these objects were not created by the Neo4j Spatial library, but 
>>>    created by some other code? How did you create them? I suspect there is 
>>>    something not quite right there.
>>>    - The BBox values for POINT objects should be points themselves (ie. 
>>>    (x1,y1) == (x2,y2)). And in fact I see for all objects with gtype==1, 
>>> this 
>>>    is true. For other objects, you have bigger bounding boxes, which makes 
>>>    sense for the type, but since they are actually only points, it no 
>>> longer 
>>>    makes sense.
>>>    - When I look into the layer node, I see that the GeometryEncoder is 
>>>    the SimplePointEncoder, consistent with the observation that all data 
>>> are 
>>>    x,y pairs (Points)
>>>    - But I see the layer implementation is the EditableLayerImpl, which 
>>>    is more often used for WKT Geometries (allowing LineString and Polygon 
>>>    also).
>>>
>>> The test code that I wrote was in Java and based on your sample. The 
>>> main part of the code looks like this:
>>> SpatialDatabaseService spatial = new SpatialDatabaseService(graphDb);
>>> Layer layer = spatial.getLayer(layerName);
>>> GeometryFactory gf = layer.getGeometryFactory();
>>> Envelope envelope = new Envelope(0.5, 1.5, 0.5, 1.5);
>>> Geometry geom = gf.toGeometry(envelope);
>>> try (Transaction tx = graphDb.beginTx()) {
>>> List<Node> nodes = GeoPipeline.startWithinSearch(layer, 
>>> geom).toNodeList();
>>> for (Node node : nodes) {
>>> System.out.println("Node[" + node.getId() + ":" + node.getProperty("id") 
>>> + "]: " + nodeXY(node) + " - "
>>> + nodeBBox(node));
>>> }
>>> assertEquals("Only one node should be in envelope", nodes.size(), 2);
>>> tx.success();
>>> }
>>>
>>> This test passes on the two nodes that look like Point(1,1) as expected. 
>>> However, since you probably meant the second one to be a LineString 
>>> (gtype=2), it probably was supposed to intersect the envelope, not be 
>>> included. But since you use the SimplePointEncoder, it will be seen as a 
>>> point at 1,1, so it will be included.
>>>
>>> My understanding is that you created the data incorrectly, using a 
>>> SimplePointEncoder for data that you meant to be LineString and Polygon. I 
>>> suggest that you rather use the WKT encoder. Do not create the nodes 
>>> yourself, but use the layer.add(Geometry) to create them for you, and then 
>>> add your own properties to them afterward, so you are sure the geoemtry 
>>> information is correctly created.
>>>
>>> Regards, Craig
>>>
>>>
>>>
>>> On Thu, Sep 4, 2014 at 1:03 PM, Alireza Rezaei Mahdiraji <
>>> [email protected]> wrote:
>>>
>>>>
>>>> Hi Craig, 
>>>>
>>>> I attached the neo4j database folder for the toy example I am using. 
>>>>
>>>> The envelop I am using is as follow: xmin: 0.5, xmax: 1.5,  ymin: -0.5, 
>>>> ymax: 1.5
>>>>
>>>> This envelop only contains one graph vertex fully, the vertex with x=1 
>>>> and y=1
>>>> but code returns several other results too which are partially 
>>>> contained by the envelop. 
>>>>
>>>> Thanks,
>>>> Best,
>>>> Alireza
>>>>
>>>> On Wednesday, September 3, 2014 5:08:36 PM UTC+2, Craig Taverner wrote:
>>>>>
>>>>> Hi Alireza,
>>>>>
>>>>> That code looks OK. Could you send me some sample data? I could try 
>>>>> this myself and see what the problem is. The code underneath is using the 
>>>>> JTS function Geometry.within(Geometry) and that is strictly defined. See 
>>>>> http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/geom/
>>>>> Geometry.html#within(com.vividsolutions.jts.geom.Geometry).
>>>>>
>>>>> But if I try your data I could double-check if there is perhaps an 
>>>>> issue in how we use this.
>>>>>
>>>>> Regards, Craig
>>>>>
>>>>>
>>>>>
>>>>> On Wed, Sep 3, 2014 at 3:15 PM, Alireza Rezaei Mahdiraji <
>>>>> [email protected]> wrote:
>>>>>
>>>>>>
>>>>>> I tried this snippet: 
>>>>>>
>>>>>> GeometryFactory gf = layer.getGeometryFactory();
>>>>>> Geometry geom = gf.toGeometry(envelope);
>>>>>> List<Node> nodes = GeoPipeline.startWithinSearch(layer, 
>>>>>> geom).toNodeList();
>>>>>>
>>>>>> but the result still contains nodes which are not fully inside the 
>>>>>> envelope. 
>>>>>>
>>>>>> What am I missing?
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Alireza
>>>>>>
>>>>>>
>>>>>> On Tuesday, September 2, 2014 10:35:38 AM UTC+2, Craig Taverner wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> I can see two ways in the Java API to do this. One is the 'within' 
>>>>>>> filter in the GeoPipeline.
>>>>>>>
>>>>>>>    - See example usage in the test code at 
>>>>>>>    - See the implementation using JTS in the code at 
>>>>>>>    https://github.com/neo4j-contrib/spatial/blob/master/src/mai
>>>>>>>    n/java/org/neo4j/gis/spatial/pipes/filtering/FilterWithin.
>>>>>>>    java#L47 
>>>>>>>    
>>>>>>> <https://github.com/neo4j-contrib/spatial/blob/master/src/main/java/org/neo4j/gis/spatial/pipes/filtering/FilterWithin.java#L47>
>>>>>>>  
>>>>>>>
>>>>>>> And the other is the older, but still functional use of CQL for 
>>>>>>> within queries:
>>>>>>>
>>>>>>>    - See an example using dynamic layers at 
>>>>>>>    https://github.com/neo4j-contrib/spatial/blob/master/src/
>>>>>>>    test/java/org/neo4j/gis/spatial/TestDynamicLayers.java#L138 
>>>>>>>    
>>>>>>> <https://github.com/neo4j-contrib/spatial/blob/master/src/test/java/org/neo4j/gis/spatial/TestDynamicLayers.java#L138>
>>>>>>>  
>>>>>>>    - And the implementation at https://github.com/neo4j-co
>>>>>>>    ntrib/spatial/blob/master/src/main/java/org/neo4j/gis/spatia
>>>>>>>    l/filter/SearchCQL.java#L56 
>>>>>>>    
>>>>>>> <https://github.com/neo4j-contrib/spatial/blob/master/src/main/java/org/neo4j/gis/spatial/filter/SearchCQL.java#L56>
>>>>>>>    
>>>>>>> A direct usage of the SearchCQL class is also possible, but I did 
>>>>>>> not see a test case for it. It was used by the GeoServer integration 
>>>>>>> though.
>>>>>>>
>>>>>>> Regards, Craig
>>>>>>>  
>>>>>>>
>>>>>>> On Mon, Sep 1, 2014 at 5:15 PM, Alireza Rezaei Mahdiraji <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>>  
>>>>>>>> Hi All, 
>>>>>>>>
>>>>>>>> I would like to find nodes of the graph which are completely (not 
>>>>>>>> partially) contained in a given 
>>>>>>>> Envelope. I tried several GeoPipeline methods but it seems they 
>>>>>>>> all consider partial containment. 
>>>>>>>> Any idea? 
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Best,
>>>>>>>> Alireza
>>>>>>>>
>>>>>>>>  -- 
>>>>>>>> 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 [email protected].
>>>>>>>>
>>>>>>>> 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 [email protected].
>>>>>> 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 [email protected].
>>>> 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 [email protected] <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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to