【问题标题】:Neo4j-ogm query pathNeo4j-ogm 查询路径
【发布时间】:2015-12-29 14:07:13
【问题描述】:

在我的 Java 代码中,我有一个查询来匹配树中从根到叶子的最短路径。

Strinq query = "Match path = (p:Root)-[*1..100]-(m:Leaf) "
    + "WITH p,m,path ORDER BY length(path) LIMIT 1 RETURN path";

但是,当我尝试如下查询时

SessionFactory sessionFactory = new SessionFactory("incyan.Data.Neo4j.Models");
Session session = sessionFactory.openSession("http://localhost:7474");
Object o = session(query, new HashMap<String,Object>());

o 包含 ArrayListLinkedHashMaps 而不是映射对象。

我什至无法确定路径元素的标签以及关系的开始和结束节点。

我做错了什么?

【问题讨论】:

    标签: java neo4j neo4j-ogm


    【解决方案1】:

    当前的 neo4j-ogm 版本没有将查询结果映射到域实体。返回路径只会为您提供该路径中节点和关系的属性(按顺序,因此您可以推断关系开始/结束)。 OGM 当前用于此特定操作的 Neo4j REST api 不会返回 ID,这就是它们丢失的原因。您可能需要提取 ID 并将其作为查询的一部分返回。

    将单个查询结果列映射到实体将在 Neo4j-OGM 2.0 版本中提供。

    【讨论】:

      【解决方案2】:

      我不确定 Java 位,但如果您使用 shortestPath 函数(关键字?),您的查询应该更有效:

      MATCH path=shortestPath((p:Root)-[*1..100]-(m:Leaf))
      RETURN path
      

      另外,我不知道您的数据模型是什么样的,但我希望您的树(我假设它是一棵树)节点上的标签都相同。您可以使用 Cypher 判断一个节点是根还是叶:

      MATCH path=shortestPath((root:Element)-[*1..100]-(leaf:Element))
      WHERE NOT((root)-[:HAS_PARENT]->()) AND NOT(()-[:HAS_PARENT]->(leaf))
      RETURN path
      

      【讨论】:

      • >>但是如果你使用 shortestPath 函数......非常感谢。将修改我的查询。 >>> 我不知道你的数据模型是什么样的,但我希望你的树节点上的标签......不。我的树有一个标有“根”标签的根元素。所有其他节点都有标签“Leaf”或“BranchBase”。如果我在 neo4j web gui 中执行查询,它会返回正确的路径。我的问题与 java 的 neo4j-ogm 库有关。它不会将返回的对象映射到我定义的 java 实体,如下所述:neo4j.com/docs/ogm/java/stable
      • 相反,session.query() 返回 ArrayListLinkedHashMaps。
      • 啊,那么公平。我会让其他人回答 java OGM 问题;)另外,如果你不知道,Neo4j 中的节点可以有多个标签,所以如果你想将一些节点标记为 Root / Leaf,你可以还有一个标签包含所有这些标签,用于不同的查询情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多