当前位置: 首页 > 知识库问答 >
问题:

Neo4J、SDN和运行Cypher空间查询

巫马俊力
2023-03-14

我是Neo4J的新手,我正在尝试为基于时空的高可用性查询建立一个概念证明。

我有一个设置,有2个独立的Neo4J企业服务器和一个运行嵌入式HA Neo4J服务器的Java应用程序

一切都很容易设置,基本查询也很容易设置和高效。另外,按照预期执行从Neo4J SpatialRepository派生的查询。

我正在努力理解的是如何使用SDN与任何其他where子句组合进行空间查询。作为一个微不足道的例子,我怎么能写找到所有的地方用户称为X已经在Y英里内拉特/伦。因为空间存储库不是常规的Spring存储库类树的一部分,我不相信有任何命名约定,我可以使用,我的意图是执行空间查询,然后过滤结果吗?

我已经追踪到了一个LegacyIndexSearcher(它的名字让我害怕!)并且看不到任何扩展搜索的机制。我还研究了GitHub上的IndexProviderTest,它可以提供一种手动机制来执行对索引的查询,只是我认为可能有两个索引在起作用。

如果我理解如何构造一个Cypher查询,我可以在@Query注释中使用它,这可能会有所帮助。虽然我已经能够使用控制台执行一个简单的REST查询使用:

  :POST /db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance
  {
    "layer":"location", 
    "pointX":0.0, 
    "pointY":51.526256, 
    "distanceInKm":100 
  }

这不起作用:

  start n=node:location('withinDistance:[51.526256,0.0,100.0]') return n;

错误是:

  Index `location` does not exist
  Neo.ClientError.Schema.NoSuchIndex

索引是(可能是天真地)使用Spring创建的:

  @Indexed(indexType = IndexType.POINT, indexName = "location")
  String wkt;

如果我在控制台中运行index--index,我可以看到没有名为位置的索引,但是有一个名为location__neo4j-spatial__LayerNodeIndex__internal__spatialNodeLookup__

是否需要手动创建索引?如果是这样,谁能给我指一下留档的方向,我就继续。

假设只是无知阻止了我运行简单的Cypher查询,那么向查询添加一个常规的Cypher WHERE子句来执行基于空间和属性的查询组合就这么简单吗?

html" target="_blank">添加了更多索引详细信息
在运行:GET/db/data/index/node/之后,我可以从控制台看到两个可能有用的索引(其他索引已删除):

{
  "location__neo4j-spatial__LayerNodeIndex__internal__spatialNodeLookup__": {
    "template": "/db/data/index/node/location__neo4j-spatial__LayerNodeIndex__internal__spatialNodeLookup__/{key}/{value}",
    "provider": "lucene",
    "type": "exact"
  },
  "GeoTemporalThing": {
    "template": "/db/data/index/node/GeoTemporalThing/{key}/{value}",
    "provider": "lucene",
    "type": "exact"
  }
}

因此,也许这应该是我尝试的查询的正确格式:

start n=node:GeoTemporalThing('withinDistance:[51.526256,0.0,100.0]') return n;

但这给了我这个错误(我现在在谷歌上搜索)

org.apache.lucene.queryParser.ParseException: Cannot parse 'withinDistance:[51.526256,0.0,100.0]': Encountered " "]" "] "" at line 1, column 35.
Was expecting one of:
    "TO" ...
     ...
     ...

更新
在决定我的索引不存在并且应该使用REST接口创建一个名为SDN的索引后,我希望SDN这样创建:

:POST /db/data/index/node
{
  "name" : "location",
  "config" : {
    "provider" : "spatial",
    "geometry_type" : "point",
    "wkt" : "wkt"
  }
}

而且,现在一切似乎都很好。所以,我的问题是,我应该手动创建索引吗?如果我看一下org中的代码。springframework。数据neo4j。支持指数IndexType它看起来应该完全使用我上面使用的设置,但它只创建了名为Lucene的长索引:

public enum IndexType
{   
    @Deprecated
    SIMPLE   { public Map getConfig() { return LuceneIndexImplementation.EXACT_CONFIG; } },
    LABEL    { public Map getConfig() { return null; }  public boolean isLabelBased() { return true; }},
    FULLTEXT { public Map getConfig() { return LuceneIndexImplementation.FULLTEXT_CONFIG; } },
    POINT    { public Map getConfig() { return MapUtil.stringMap(
                      IndexManager.PROVIDER, "spatial", "geometry_type" , "point","wkt","wkt") ; } }

    ;

    public abstract MapgetConfig();

    public boolean isLabelBased() { return false; }
}

我确实清理了系统,行为是一样的,有没有我错过的一步?

软件详细信息:

Java:
neo4j2.0。1
neo4j ha 2.0。1
neo4j空间0.12-neo4j-2.0。1
spring-data-neo4j 3.0。0.1释放

独立服务器:
neo4j-enterprise-2.0。1
neo4j-spatial-0.12-neo4j-2.0。1-服务器-插件

共有1个答案

贺景铄
2023-03-14

设置索引时,我不确定这是否是Spring数据中的错误,但使用REST索引手动创建索引有效:

:POST /db/data/index/node
{
  "name" : "location",
  "config" : {
    "provider" : "spatial",
    "geometry_type" : "point",
    "wkt" : "wkt"
  }
}

现在,我可以在@Query注释中使用cypher以最小的工作量执行查询(显然还有更多参数):

@Query(value = "start n=node:location('withinDistance:[51.526256,0.0,100.0]') MATCH user-[wa:WAS_HERE]-n WHERE wa.ts > {ts} return user"
Page findByTimeAtLocation(@Param("ts") long ts);
 类似资料:
  • 我有一个Spring Data Neo4j(3.4.0.RELEASE)实体,它带有一个

  • Cypher对我来说似乎比Gremlin要清楚得多,总的来说,Neo4j的家伙似乎都在和Cypher一起。但是--如果Cypher与Gremlin相比是有限的--我真的想提前知道这一点。

  • 我想使用Spring数据Neo4j在Neo4j中建模一个包含公司及其业务关系的图。所以我为公司创建了节点,为业务关系创建了边缘。然而,有一系列不同类型的关系(买方、供应商、制造商等,还有一种通用版本“与之做生意”)。每个关系只有一个属性,即目标公司的源公司的内部ID,例如,买方有每个供应商的内部ID。每一对公司在每个方向上都可以有一种类型的关系。 我建立这种关系的方式是为公司设立一个@NodeEn

  • 许多人声称SDN版本是3.3.1或4.0.0。RC1应该与neo4j 2.2. x工作,但我不能使它工作。 我有以下spring配置: 这将生成此异常: 查看代码可以清楚地看到:SDN指的是neo4j库中的一个类,它在2.2中被删除。x: 在这种情况下,我有什么选择?

  • 我有一个密码脚本文件,我想直接运行它。 就我所知,我能找到的所有答案都使用命令,在我的版本(Neo4j server 3.5.5)中,该命令似乎不推荐使用,而是用命令代替。 一个命令行shell,您可以在其中对neo4j的实例执行Cypher。缺省情况下,shell是交互式的,但是您可以通过直接在命令行上传递cypher或通过管道传输带有cypher语句的文件(在Windows上需要Powersh