用于检查位置和子位置的 Cypher 查询

Cypher query to check locations and sublocations

我有 Profile 节点,它可以通过 :LOCATED_IN 关系链接到 Location 节点。 反过来,Location 表示嵌套 Location 节点的无限复合结构,这些节点与它们之间的 :CONTAINS 关系链接。

我需要在无限级别上找到所有链接到指定位置 ID 或其父位置的配置文件。

我正在尝试创建这样的 Cypher 查询,但它没有按预期工作。这是我目前所拥有的:

MATCH (d:Profile)-[:LOCATED_IN]-(l:Location) 
OPTIONAL MATCH (pl:Location)-[:CONTAINS*]->(l) 
WHERE any(x IN l.id WHERE x IN [100,34]) OR any(x IN pl.id WHERE x IN [100,34]) 
RETURN d;

我做错了什么以及如何解决?

如果我没理解错的话,你应该从 Location 节点开始,一直到 Profile 节点。

MATCH (l:Location)-[:CONTAINS*0..]->()-[:LOCATED_IN]-(p:Profile)
WHERE l.id IN [100,34]
RETURN distinct p

所以你通过 id 来识别你的开始位置。 然后使用 CONTAINS*0..,这意味着它应该从零跳(意味着它可以跳过它)遍历 CONTAINS 关系到理论上的无限跳,并查看这些节点中的任何一个是否附加了配置文件.

我不确定父位置是否是从子到父的定向 CONTAINS 关系,但从您的初始查询来看它是。除此之外,我认为它应该可以。

我想这可行

WITH [100,34]  AS locationIDs

// get paths, starting at root, ending at the nodes I need
MATCH locationPath=(root:Location)-[:CONTAINS*0..]->(descendant:Location)
WHERE NOT EXISTS (()-[:CONTAINS]->(root))
      AND id(descendant) IN (locationIDs+[id(root)])

// create a collection of unique nodes on the locationPaths
UNWIND nodes(locationPath) AS pathNode
WITH COLLECT(DISTINCT pathNode) AS pathNodes

// find profiles linked to at least one of the pathNodes
MATCH (d:Profile)-[:LOCATED_IN]->(pathNode)
WHERE pathNode IN pathNodes
RETURN d