NEO4J-匹配中间节点可能存在或不存在的路径
我有以下图表: 我希望得到所有承包商、分包商和客户,从David开始。 所以我想到了这样一个问题:NEO4J-匹配中间节点可能存在或不存在的路径,neo4j,cypher,Neo4j,Cypher,我有以下图表: 我希望得到所有承包商、分包商和客户,从David开始。 所以我想到了这样一个问题: MATCH(a:承包商)-[*0..1]->(b)-[w:工程]->(c:客户)返回a、b、c 这将返回: (0:contractor {name:"David"}) (0:contractor {name:"David"}) (56:client {name:"Sarah"}) (0:contractor {name:&quo
MATCH(a:承包商)-[*0..1]->(b)-[w:工程]->(c:客户)返回a、b、c
这将返回:
(0:contractor {name:"David"}) (0:contractor {name:"David"}) (56:client {name:"Sarah"})
(0:contractor {name:"David"}) (1:subcontractor {name:"John"}) (56:client {name:"Sarah"})
返回所需的结果。这里的问题是性能。
如果数据库包含数百万条记录,而我离开(b)时没有标签,那么查询将花费永远的时间。如果我在(b)
中添加一个标签,例如(b:分包商)
,我不会点击数百万行,但我只会得到分包商的结果:
(0:承包商{name:“David”})(1:分包商{name:“John”})(56:客户{name:“Sarah”})
有没有更有效的方法
链接到图示例:
,在查询中有一些事情需要考虑。 未指定关系类型-是否只有来自
承包商
节点的关系是工程(针对
和租用
)?如果不匹配,则应约束查询中匹配的关系类型。比如说
MATCH (a:contractor)-[:works_for|:hired*0..1]->(b)-[w:works_for]->(c:client)
RETURN a,b,c
(b)未标记并不意味着图中的每个节点都将匹配。通过遍历工程或雇佣关系(如有规定),或通过:承包商的任何关系,或通过工程关系(如有规定),可以达到该目标
如果确实要为其添加标签,并且具有类型层次结构,则可以将多个标签指定给节点,并在查询中使用最常用的标签。例如,您可以使用诸如ExternalStaff
之类的标签作为通用标签,然后进一步添加Contractor
或SubContractor
以区分各个节点。然后你可以做类似的事情
MATCH (a:contractor)-[:works_for|:hired*0..1]->(b:ExternalStaff)-[w:works_for]->(c:client)
RETURN a,b,c
这完全取决于您的用例。谢谢,[:works_for |:hired]似乎可以做到这一点(此语法已被弃用,现在编写为[:works_for | hired])。关于添加新的通用标签,在我们当前的体系结构中是不可能的。还有其他可能性吗?