如何使用密码查询从 2 条可能的路径定义 Neo4j 节点 属性?
How can I define a Neo4j node property from 2 possible paths with a cypher query?
对 neo4j/cypher 很陌生。我正在尝试 return 一个 属性 由 2 个不同的路径访问,具体取决于标签,在本例中为 (n) 的标签。
MATCH (k:KeyNode)<-[:BASED_ON]-(n)-[:CONTROLS|:MODIFIES]->()
WHERE id(k)=123456
//if label(n) = LabelA
OPTIONAL MATCH (n)<-[:LABEL_A_REL]-(c:Controller)-[:CONTROLS]->(r:Resource)-[:TYPE_OF]->(rt:ResourceType)
//if label(n) = NotLabelA
OPTIONAL MATCH (n)-[:LABEL_NOT_A_REL]->(r:Resource)-[:TYPE_OF]->(rt:ResourceType)
OPTIONAL MATCH (r)-[:PARENT*]->(ro:Room)
RETURN ID(r) as resourceId, ID(ro) as siteId, ID(rt) as rt:ResourceType
照原样,路径定义的第一个可选匹配及其定义的节点优先,第二个选择 match/path 节点重新定义保持不变,我假设是因为 cypher 不会重新定义变量。目标是在 2 条可能路径上找到 (r) 和 (rt)。
我考虑过使用 CASE WHEN 结构,但从文档中我看到只有 return 单个属性的选项,而不是多个(尽管我可能是错的)
这可能是一种方法:
MATCH (k:KeyNode)<-[:BASED_ON]-(n)-[:CONTROLS|:MODIFIES]->()
WHERE id(k)=123456
OPTIONAL MATCH (n)<-[:LABEL_A_REL]-(c:Controller)-[:CONTROLS]->(r1:Resource)-[:TYPE_OF]->(rt1:ResourceType)
OPTIONAL MATCH (n)-[:LABEL_NOT_A_REL]->(r2:Resource)-[:TYPE_OF]->(rt2:ResourceType)
// COALESCE to deal with precedence
WITH COALESCE(r1,r2) AS r,
COALESCE(rt1,rt2) AS rt
OPTIONAL MATCH (r)-[:PARENT*]->(ro:Room)
RETURN ID(r) as resourceId, ID(ro) as siteId, ID(rt) as rt:ResourceType
对 neo4j/cypher 很陌生。我正在尝试 return 一个 属性 由 2 个不同的路径访问,具体取决于标签,在本例中为 (n) 的标签。
MATCH (k:KeyNode)<-[:BASED_ON]-(n)-[:CONTROLS|:MODIFIES]->()
WHERE id(k)=123456
//if label(n) = LabelA
OPTIONAL MATCH (n)<-[:LABEL_A_REL]-(c:Controller)-[:CONTROLS]->(r:Resource)-[:TYPE_OF]->(rt:ResourceType)
//if label(n) = NotLabelA
OPTIONAL MATCH (n)-[:LABEL_NOT_A_REL]->(r:Resource)-[:TYPE_OF]->(rt:ResourceType)
OPTIONAL MATCH (r)-[:PARENT*]->(ro:Room)
RETURN ID(r) as resourceId, ID(ro) as siteId, ID(rt) as rt:ResourceType
照原样,路径定义的第一个可选匹配及其定义的节点优先,第二个选择 match/path 节点重新定义保持不变,我假设是因为 cypher 不会重新定义变量。目标是在 2 条可能路径上找到 (r) 和 (rt)。
我考虑过使用 CASE WHEN 结构,但从文档中我看到只有 return 单个属性的选项,而不是多个(尽管我可能是错的)
这可能是一种方法:
MATCH (k:KeyNode)<-[:BASED_ON]-(n)-[:CONTROLS|:MODIFIES]->()
WHERE id(k)=123456
OPTIONAL MATCH (n)<-[:LABEL_A_REL]-(c:Controller)-[:CONTROLS]->(r1:Resource)-[:TYPE_OF]->(rt1:ResourceType)
OPTIONAL MATCH (n)-[:LABEL_NOT_A_REL]->(r2:Resource)-[:TYPE_OF]->(rt2:ResourceType)
// COALESCE to deal with precedence
WITH COALESCE(r1,r2) AS r,
COALESCE(rt1,rt2) AS rt
OPTIONAL MATCH (r)-[:PARENT*]->(ro:Room)
RETURN ID(r) as resourceId, ID(ro) as siteId, ID(rt) as rt:ResourceType