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

Neo4j-获取给定节点的所有相关节点和关系,neo4j,cypher,spring-data-neo4j,neo4j-ogm,Neo4j,Cypher,Spring Data Neo4j,Neo4j Ogm,我在我的应用程序中使用了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" +

我在我的应用程序中使用了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);
我的理解是,在这种情况下,有两部分会被退回

我想知道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)
问候,,
我在这里看到三个问题:

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

MATCH q=(v)-[:HAS_PART]->(part)-[:FROM_DEALER|:IS_LINKED_WITH]->()
这意味着当您查询P1时,它与P2不匹配,因此只返回P1

第二个问题是您的查询与您的方法不完全匹配,该方法被声明为返回
可选
,而您的查询希望返回同一路径
q
上的所有节点(和关系)。此外,该方法的名称(
findByIdForGivenPart
)并不能完全表达您希望用它完成的任务

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

MATCH (Vehicle:v{id:{vehicleId}})
MATCH (Part:part{id:{id}})
我认为应该是:

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

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

请共享具有相同id但有2个不同节点的P2的示例数据。显示并使用示例中的关系。谢谢。P1和P2是Part类型的两个节点。P1和P2是它们的ID。如果这有道理的话。经销商类型的D1、D2等节点的情况也是如此
MATCH (v:Vehicle {id:{vehicleId}})
MATCH (part:Part {id:{id}})