用于检查位置和子位置的 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
我有 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