Neo4j空间';不明确';Cypher查询返回空,而REST调用返回数据

Neo4j空间';不明确';Cypher查询返回空,而REST调用返回数据,neo4j,spatial,Neo4j,Spatial,我有一个正确配置的空间层和索引,可以使用FindGeometriesWithindDistance RESTAPI调用成功地查询节点 POST /db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance {"layer":"geom","pointX":15.0,"pointY":60.0,"distanceInKm":100.0} 但是,当使用cypher进行查询时,我没有得到任何结果(我尝试过在没有运气的情况下颠倒60.0

我有一个正确配置的空间层和索引,可以使用FindGeometriesWithindDistance RESTAPI调用成功地查询节点

POST /db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance {"layer":"geom","pointX":15.0,"pointY":60.0,"distanceInKm":100.0}
但是,当使用cypher进行查询时,我没有得到任何结果(我尝试过在没有运气的情况下颠倒60.0和15.0的顺序):

Cyper返回:

==> +---+
==> | n |
==> +---+
==> +---+
==> 0 row
==> 
==> 13 ms
其余:

要复制的REST调用: 创建图层:

POST /db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer { "layer":"geom", "lat":"lat", "lon":"lon" }
创建索引:

POST /db/data/index/node/ {"name":"geom", "config":{"provider":"spatial", "geometry_type":"point","lat":"lat","lon":"lon"}}
创建节点:

POST /db/data/node {"lat":60.2,"lon":15.1,"RaceName":"Parador Es Muy Caliente"}
(作为回应,检查“self”并找到nodeid)

为节点编制索引:

POST /db/data/ext/SpatialPlugin/graphdb/addNodeToLayer {"layer":"geom", "node":"http://localhost:7474/db/data/node/###NEW_NODE_ID###"}
查找:

这是一个bug,如果您愿意,请随意调查,似乎是SpatialRecordHits.java中的迭代


同时,在通过索引进行查询之前,请确保将节点添加到索引中,因为这样会创建正确的节点结构。

我对此进行了研究,它与我们已经见过几次的问题有关。在空间库的设计中存在一个不一致之处,即有两种方法可以将节点添加到空间索引中。一种是将其添加到层中(使用addNodeToLayer REST调用),这使用底层Java API将节点直接连接到RTree中,作为同一图形的一部分。另一种方法是在索引图中创建代理节点,以便域图不连接到索引图。第二种方法仅由IndexProvider接口采用(使用/db/data/index/node/geom REST调用)

如果同时调用这两个方法,将添加两次节点,一次直接添加,一次通过代理添加。问题是Cypher WithindInstance索引查询只访问IndexProvider接口,并且只返回未连接到索引的节点。因此,如果以两种方式添加节点,则不会返回该节点

因此,您只需要添加两种方法中的一种。我在您的原始电子邮件中没有看到任何关于addNodeToLayer的提及,因此我怀疑SDN可能正在呼叫addNodeToLayer(也许Michael可以评论),在这种情况下,您不能使用cypher呼叫

在测试过程中,我可以使用密码手动删除一个索引关系,如下所示:


START n=node(13065)MATCH(n)感谢您的帮助Peter-正如您在电子邮件中指出的,正确的解决方案是将节点添加到索引中,而不仅仅是层:
POST/db/data/index/node/geom{“value”:“dummy”,“key”:“dummy”,“uri”:http://localhost:7474/db/data/node/1234“}
一旦我这么做了,Cypher查询工作得很好:
start n=node:Places('withinDistance:[15.0,60.0,100.0])返回n不确定我在测试中怎么会错过这个,但再次感谢你指出它。Peter-我的一个问题是我是否真的需要将节点添加到层中。空间查询似乎可以使用或不使用该步骤。你能给我或告诉我一些关于这方面的见解吗?TroyYes,索引步骤将域节点添加到层中,并创建另一个几何体节点,该节点添加到索引中并具有对域节点的引用,Sony可以通过索引查找找到该节点。这不同于只添加到不执行第二步的层。这有点烦人,所以我们计划让它更加一致:-)/peterIn这种形式的索引,不需要键/值,它们不被使用。在这方面,空间索引的工作方式与标签上的新索引非常相似——纯粹从配置收集其信息/彼得希尔是我当时理解它的方式:1)创建空间层,定义层名称,以及我将使用的纬度和经度键:{“层”:“位置”,“纬度”:“纬度”,“经度”,“经度”,“经度”}2)我创建我的空间索引,引用我的层名称作为名称,并为提供者、几何体类型、纬度和经度添加配置值:{“名称”:“位置”,“config”:{“provider”:“spatical”,“geometry_type”:“point”,“lat”:“lat”,“lon”:“lon”}}3)创建节点并确保其具有lat和lon的属性。{“RaceName”:“My Really Big Marathon”,“RaceID”:1234,“lat”:60.1,“lon”,-112.2}4)将新节点从#2添加到索引中。这解释了为什么它只有在重新启动数据库后才能工作!事实上,一开始,我不知道密码使用中的lat/lon反转,所以我想:“如果我也手动将节点添加到索引中会怎么样“=>以两个索引结尾,阻止了良好的使用,即使我使用了正确的方法。重新启动后,我保留了一个索引(没有这样做),并以良好的方式调用了api。谢谢:)我刚刚测试了REST调用,它很好地返回了一些项目。在我的例子中,这两种用法(REST和Cypher)都是使用SDN3.1.2开箱即用的。我看到了RTREE_参考的链接,但不是域节点,只是包含
wkt
信息和真实域节点的
id
的节点。我做了更多的测试,如果我以不同的顺序调用addNodeToLayer方法和index/node/geom方法,我会得到不同的结果。如果先添加到索引,两种搜索方法都可以工作(尽管findGeometriesWithinDistance返回代理)。如果我先添加到图层,则只有FindGeometries WithindDistance起作用。我没有进一步调查原因。这仍然支持这样一种观点,即最好始终只使用一种方法。Jim Biard报告说,如果给节点一个id=id属性,那么这两种方法都可以工作,但是如果从索引中删除节点,它将被删除,因此必须先删除id属性。我还没有测试过这个。
POST /db/data/node {"lat":60.2,"lon":15.1,"RaceName":"Parador Es Muy Caliente"}
POST /db/data/ext/SpatialPlugin/graphdb/addNodeToLayer {"layer":"geom", "node":"http://localhost:7474/db/data/node/###NEW_NODE_ID###"}
POST /db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance {"layer":"geom","pointX":15.0,"pointY":60.0,"distanceInKm":100.0}
:POST /db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer { "layer":"geom", "lat":"lat", "lon":"lon" }
:POST /db/data/index/node/ {"name":"geom", "config":{"provider":"spatial", "geometry_type":"point","lat":"lat","lon":"lon"}}
:POST /db/data/node {"lat":60.2,"lon":15.1,"RaceName":"Parador Es Muy Caliente"}
:POST /db/data/index/node/geom {"value":"dummy","key":"dummy", "uri":"http://localhost:7474/db/data/node/13071"}
start n = node:geom("withinDistance:[60.2,15.1,100.0]") return n
:POST /db/data/ext/SpatialPlugin/graphdb/addNodeToLayer {"layer":"geom", "node":"http://localhost:7474/db/data/node/13071"}
:POST /db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance {"layer":"geom","pointX":15.0,"pointY":60.0,"distanceInKm":100.0}