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

Neo4j-获取给定节点的所有相关节点和关系

苏胤
2023-03-14

我使用Neo4j(版本3.4.1)和Spring-data-neo4j(5.0.10)。RELEASE)在我的应用程序中。我也在使用OGM。

我的节点之间有以下关系:

车辆(V)具有部件(P1和P2)。零件可从经销商处购买(D1、D2和D3)。零件本身可以相互链接(例如P2与P1链接)

我正在尝试编写一个密码查询,以获取与id匹配的零件节点。我希望获取该节点及其相关节点和关系。

下面是我的查询:

@Query(("MATCH (Vehicle:v{id:{vehicleId}}) \n" +
            "MATCH (Part:part{id:{id}}) \n" +
            "WITH DISTINCT part \n" +
            "MATCH q=(v)-[:HAS_PART]->(part)-[:FROM_DEALER|:IS_LINKED_WITH]->()\n" +
            "RETURN nodes(q), relationships(q)"))
    Optional<Part> findByIdForGivenPart(@Param("vehicleId") String vehicleId, @Param("id") String id);

当我运行P1部分的查询传递id时,我得到了正确的结果。但是,当我通过P2部分的id运行它时,我得到一个异常

org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected at most 1   

我的理解是,在这种情况下,有两部分会被退回。

我想知道cypher查询语法,以便在传递P2的id时获得正确的结果(即P2)及其相关节点。我希望P1节点也应该返回,因为P2与P1链接。

任何帮助将高度赞赏。

编辑:添加查询以生成示例数据。

merge (v:Vehicle{id:'V1'})-[:HAS_PART]->(p:Part{id:'P1'})-[:FROM_DEALER]->(d1:Dealer{id:'D1'})

match(p:Part{id:'P1'})
merge (p)-[:FROM_DEALER]->(d2:Dealer{id:'D2'})

match (v :Vehicle{id:'V1'})
match (d2:Dealer{id:'D2'})
merge (v)-[:HAS_PART]->(p:Part{id:'P2'})-[:FROM_DEALER]->(d2)

match(p2:Part{id:'P2'})
match(p1:Part{id:'P1'})
merge (p2)-[:FROM_DEALER]->(d3:Dealer{id:'D3'})
merge (p2)-[:IS_LINKED_WITH]->(p1)

你好,V

共有1个答案

劳和雅
2023-03-14

我在这里看到三个问题:

首先,您在第三个MATCH子句中使用了从part到末尾未命名节点的定向关系:

MATCH q=(v)-[:HAS_PART]->(part)-[:FROM_DEALER|:IS_LINKED_WITH]->()

这意味着当您查询P1时,它与P2不匹配,因此唯一的:返回P1

第二个问题是您的查询与您的方法不完全匹配,该方法被声明为返回可选

第三个问题是,前两个MATCH子句似乎在语法中切换了别名和指定的标签:

MATCH (Vehicle:v{id:{vehicleId}})
MATCH (Part:part{id:{id}})

我相信这些应该是:

MATCH (v:Vehicle {id:{vehicleId}})
MATCH (part:Part {id:{id}})

这也让我相信,您的图形中可能有一些测试数据,其中的节点具有标签,例如vpart(而不是Vehiclepart),可能来自早期的MERGE语句,这些语句旨在设置测试数据。

 类似资料:
  • 我需要创建一个新的A类节点,它与User节点有关系: 现在,假设我们有新节点A的以下数据: 我试图创建节点A,使新节点A与具有“id”:4和“nodeId”:“0002-0002”(唯一节点标识符)的用户的(现有)节点之间具有关系,但用户节点将字段“name”和“firstName”更新为。 我正在使用GraphRespository代理创建它: 有没有办法不进行此更新,只与用户节点建立关系?

  • 我在我的一个项目中使用了neo4j,有一个节点只有一个属性,我想使用ID获得这个节点,它已经有一个ID了,但是当我使用这个代码时 它什么也不返回,这是我的节点 如果查询错误,那么如何使用数字查询

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 我的mySQL数据库中有如下表: 对于谓词,它将具有如下树视图: 我想创建一个可以选择起始节点并为此获得所有父节点的表单。例如,通过选择我想要获得: 步骤2: 有什么方法可以使用以下简单文本来打印此节点: 问题答案: 您的数据可以在RDF中表

  • 我有一个场景 我想从一个特定的节点(比如ID:7)开始运行BFS 如果有无法从该节点访问的节点,我想重新启动BFS(使用任何剩余节点),直到访问图的所有顶点 到目前为止,我得到的是从节点0开始并用另一个未访问的顶点重新启动的代码(部分): 如何有效地更改此代码以满足我的要求?

  • 我有组织。w3c。dom。具有5个节点的节点列表。UUID生成的节点ID。随机UUID() Dom结构: 我需要获取属性id=“value5”的节点之后的所有节点。因此,结果应该包含id=value6和id=value7的节点。 我创建了流 那么,我可以用Java 8流API来实现这一点吗?

  • 你们这些家伙,我有这样一个HTML: 这是将上述所有选项放入列表的代码: 实际上它不起作用。我不知道我错在哪里。请帮帮我。非常感谢。