0

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

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

  2. 如果可以将节点及其各自的距离返回到该点,则更有帮助?

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


更新

经过反复试验,我解决了问题 1 以及通过 Neo4jClient 与 Neo4j 空间通信的问题。下面 Neo4jClient 查询返回 1 个用户,但只返回最近的一个,即使数据库包含 2 个应该返回的用户。我还通过网络界面尝试了普通的密码,但没有任何运气。我是否完全误解了 withinDistance 应该做什么?:) 真的没有人可以对上面的问题 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;
4

2 回答 2

2

客户端不会让你使用流利的系统,你能得到的最接近的是:

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

但这会产生如下密码:

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

这是行不通的,不幸的是,这意味着您有两种选择:

  1. 获取代码并创建一个拉取请求,将其添加到
  2. 去脏并使用IRawGraphClient界面。现在这是非常不受欢迎的,我通常不会建议它,但是如果您想按原样使用客户端,我认为您没有太多选择。为此,您需要执行以下操作:(抱歉 Tatham

((IRawGraphClient)client).ExecuteGetCypherResults<Node<string>>(new CypherQuery("START n=node:geom('withinDistance:[60.0,15.0, 100.0]') RETURN n", null, CypherResultMode.Projection));

我不知道空间系统,所以你必须等待知道它的人回复你其他问题 - 我不知道返回什么(因此Node<string>返回类型,但如果你得到解决了,您应该将其更改为适当的 POCO。

于 2014-03-26T14:40:09.507 回答
1

经过反复试验和 Neo4j 谷歌小组专家的帮助,我所有的问题现在都解决了:)

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

    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,如上面的查询中那样,你会没事的。

关于这个主题的最后一个注意事项是,您不应仅将节点添加到空间层中的空间索引。在解决这个问题之前,我遇到了很多问题和奇怪的异常。

于 2014-04-02T07:47:07.947 回答