作者:亚S哥_271 | 来源:互联网 | 2023-09-25 13:23
我有以下图形:
我希望让所有承包商,分包商和客户都从大卫开始。
所以我想到了这样的查询:
MATCH (a:contractor)-[*0..1]->(b)-[w:works_for]->(c:client) return 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:subcontractor)
,我不会打几百万行,但只能得到分包商的结果:
(0:contractor {name:"David"}) (1:subcontractor {name:"John"}) (56:client {name:"Sarah"})
有没有更有效的方法?
链接到图形示例:https://console.neo4j.org/r/pry01l
查询中需要考虑一些事项。
没有指定关系类型-是来自contractor
节点的唯一关系是works_for
和hired
吗?如果不是,则应限制查询中匹配的关系类型。例如
MATCH (a:contractor)-[:works_for|:hired*0..1]->(b)-[w:works_for]->(c:client)
RETURN a,b,c
(b)未标记的事实并不意味着图中的每个节点都会匹配。可以通过遍历works_for
或hired
关系(如果已指定),:contractor
中的任何关系或通过works_for
关系来实现。
如果确实要标记它,并且具有类型层次结构,则可以将多个标签分配给节点,并仅在查询中使用最通用的标签。例如,您可以使用诸如ExternalStaff
之类的标签作为通用标签,然后进一步添加Contractor
或SubContractor
来区分各个节点。然后,您可以做类似
的操作
MATCH (a:contractor)-[:works_for|:hired*0..1]->(b:ExternalStaff)-[w:works_for]->(c:client)
RETURN a,c
实际取决于您的用例。