匹配节点可能有环的节点类型的路径

Match paths of node types where nodes may have cycles

我试图找到一个匹配模式来匹配某些节点类型的路径。我不关心关系的类型。任何关系类型都可以匹配。我只关心节点类型。

当然可以使用以下方法:

MATCH (n)-->(:a)-->(:b)-->(:c) WHERE id(n) = 0

但是,其中一些路径可能与它们自身有关。这可能是 :b,所以我也想匹配:

MATCH (n)-->(:a)-->(:b)-->(:b)-->(:c) WHERE id(n) = 0

并且:

MATCH (n)-->(:a)-->(:b)-->(:b)-->(:b)-->(:c) WHERE id(n) = 0

我可以很容易地用关系做到这一点,但我不知道如何用节点做到这一点,比如:

MATCH (n)-->(:a)-->(:b*1..)-->(:c) WHERE id(n) = 0

作为一个实际示例,假设我有一个包含人、汽车和自行车的数据库。汽车和自行车是人们“拥有”的,人们之间有儿子、女儿、丈夫、妻子等关系。我正在寻找的是从特定节点获取所有相关类型节点的查询。所以:

MATCH (n)-->(:person*1..)-->(:car) WHERE Id(n) = 0

我希望得到节点“n”,它是 parents、grandparents、children、grandchildren,所有这些都是递归的。然后是那些人,他们的车。如果我可以假设我知道完整的关系列表,并且它们只适用于人,我可以按如下方式让它工作:

MATCH
  p = (n)-->(:person)-[:son|daughter|husband|wife|etc*0..]->(:person)-->(:car)
WHERE Id(n) = 0
RETURN nodes(p)

我要查找的是相同的,无需指定完整的关系列表;但只是节点标签。

编辑:

如果你想找到从一个 Person 节点到每个 Car 节点的路径,只使用节点标签,并假设节点可能创建循环,你可以使用 apoc.path.expandConfig.

例如:

MERGE (mark:Person {name: "Mark"})
MERGE (lju:Person {name: "Lju"})
MERGE (praveena:Person {name: "Praveena"})
MERGE (zhen:Person {name: "Zhen"})
MERGE (martin:Person {name: "Martin"})
MERGE (joe:Person {name: "Joe"})
MERGE (stefan:Person {name: "Stefan"})
MERGE (alicia:Person {name: "Alicia"})

MERGE (markCar:Car {name: "Mark's car"})
MERGE (ljuCar:Car {name: "Lju's car"})
MERGE (praveenaCar:Car {name: "Praveena's car"})
MERGE (zhenCar:Car {name: "Zhen's car"})

MERGE (zhen)-[:CHILD_OF]-(mark)
MERGE (praveena)-[:CHILD_OF]-(martin)
MERGE (praveena)-[:MARRIED_TO]-(joe)
MERGE (zhen)-[:CHILD_OF]-(joe)
MERGE (alicia)-[:CHILD_OF]-(joe)
MERGE (zhen)-[:CHILD_OF]-(mark)
MERGE (anthony)-[:CHILD_OF]-(rik)
MERGE (martin)-[:CHILD_OF]-(mark)
MERGE (stefan)-[:CHILD_OF]-(zhen)
MERGE (lju)-[:CHILD_OF]-(stefan)

MERGE (markCar)-[:OWNED]-(mark)
MERGE (ljuCar)-[:OWNED]-(lju)
MERGE (praveenaCar)-[:OWNED]-(praveena)
MERGE (zhenCar)-[:OWNED]-(zhen)

运行一个查询:

MATCH (n:Person{name:'Joe'}) 
CALL apoc.path.expandConfig(n, {labelFilter: "Person|/Car", uniqueness: "NODE_GLOBAL"})
YIELD path
RETURN path

将return从Joe节点到四个car节点的4条唯一路径。路径的唯一性有几个选项,请参阅 uniqueness

/CAR 使其成为终止标签,即 returned 路径仅达到此给定标签。