Neo4j spatial withinDistance仅返回一个节点

时间:2014-03-26 06:30:41

标签: neo4j neo4jclient neo4j-spatial

我正在使用Neo4j 2.0的空间服务器插件,并设法将用户和城市的地理属性lat / lon添加到空间索引“geom”。不幸的是我无法通过Neo4jClient获得正确的语法:(我想要的基本上是:

  1. 将密码查询START n=node:geom('withinDistance:[60.0,15.0, 100.0]') RETURN n;转换为Neo4jClient语法,以便我可以从指定点获取给定距离内的所有用户。

  2. 更有帮助的是,是否可以返回节点与各自的距离?

  3. 有没有办法在没有指定距离的情况下从给定点获取最近的用户或城市?


  4. 更新

    经过一些试验和错误后,我解决了问题1,并通过Neo4jClient与Neo4j空间进行了沟通。在Neo4jClient查询下面返回1个用户,但只返回最近的用户,即使数据库包含2个应该返回的用户。我也通过网络界面尝试了普通的密码而没有任何运气。我是否完全误解了距离应该做什么? :)真的没有人可以对上面的问题2和3提供一点见解吗?非常感谢!

    var queryString = string.Format("withinDistance:[" + latitude + ", " + longitude + ", " + distance + "]");
            var graphResults = graphClient.Cypher
                .Start(new { user = Node.ByIndexQuery("geom", queryString) })
                .Return((user) => new
                {
                    EntityList = user.CollectAsDistinct<UserEntity>()
                }).Results;
    

2 个答案:

答案 0 :(得分:2)

客户端不允许您使用流畅的系统,您可以得到的最接近的是:

var geoQuery = client.Cypher
    .Start( new{n = Node.ByIndexLookup("geom", "withindistance", "[60.0,15.0, 100.0]")})
    .Return(n => n.As<????>());

但这会产生类似cypher:

START n=node:`geom`(withindistance = [60.0,15.0, 100.0])   RETURN n

哪个不行,不幸的是意味着你有两个选择:

  1. 获取代码并创建一个拉取请求,将其添加到
  2. 变脏并使用IRawGraphClient界面。现在这是非常不赞成,我通常不会建议,但如果您想按原样使用客户端,我认为您没有太多选择。要做到这一点,你需要做一些事情:(抱歉Tatham
  3. ((IRawGraphClient)client).ExecuteGetCypherResults<Node<string>>(new CypherQuery("START n=node:geom('withinDistance:[60.0,15.0, 100.0]') RETURN n", null, CypherResultMode.Projection));

    我不知道空间系统,所以你必须等待知道它的人回到你面前解决其他问题 - 我不知道返回了什么(因此{{1}返回类型,但如果你得到了解决方案,你应该将其改为适当的POCO。

答案 1 :(得分:1)

经过一些试验和错误以及Neo4j google小组专家的帮助,我的所有问题现在都解决了:)

  1. Neo4jClient可用于查询内部距离,如下所示。不幸的是,在距离内无法以正常方式处理附加参数,因此您可能需要在使用它们之前检查纬度,经度和距离。此外,这些指标必须加倍才能使查询生效。

    var queryString = string.Format("withinDistance:[" + latitude + ", " + longitude + ", " + distance + "]");
    var graphResults = graphClient.Cypher
                    .Start(new { city = Node.ByIndexQuery("geom", queryString) })
                    .Where("city:City")
                    .Return((city) => new
                    {
                        Entity = city.As<CityEntity>()
                    })
                    .Limit(1)
                    .Results;
    
  2. Cypher不能用于返回距离,你必须自己计算。显然你应该能够使用REST http://localhost:7474/db/data/index/node/geom?query=withinDistance:[60.0,15.0,100.0]&ordering=score来获得分数(距离),但我没有得到它的工作,我想要用户密码。

  3. 没有,但是如上面的查询所示,将结果限制为1,你会没事的。

  4. 关于此主题的最后一个注释是,您不应仅将空间索引添加到空间层。在弄清楚这一点之前,我遇到了很多问题和奇怪的例外。