我正在使用一个代表建筑物层次结构的 Neo4j 图表,其中建筑物包含楼层、房间,有些房间还有子房间。图中的所有节点都有通用标签 Resource 和唯一的 uri 属性,我已经对其进行了索引以加快查找速度。此外,还有表示为标记为Temperature_Sensor 的节点的传感器(例如温度传感器),它们可以存在于建筑层次结构中的各个级别。
我的目标是有效检索特定建筑节点下的所有Temperature_Sensor节点。我为此目的精心设计了以下查询:
MATCH (:Resource {uri:"building_id_a"})-[*..15]->(c:brick__Temperature_Sensor)
RETURN c.uri
这里是查询简介:
但是,这个查询似乎相当昂贵,因为它会搜索所有节点。虽然我知道我可以减少 15 以外的关系深度,但这只是一个例子,所有级别都可能有传感器。最好利用索引的 Resource 和 uri 属性。在本例中,我们标记不同类型的设备,例如泵、房间和温度传感器,并使用这些标签查找所有泵、房间和温度传感器节点。
我知道我也可以使用不同类型的关系进行过滤,但我们使用了许多不同的类型,这可能表明存在建模问题。
如果可以带来更好的查询性能,我愿意接受有关可能以不同方式对图进行建模的建议。这是Temperature_Sensor 节点的图片以了解更多背景信息:
我将非常感谢您提供的任何意见。请随时分享您的想法或建议。谢谢你!另外,如果需要的话我可以提供更多信息
由于您只对从给定建筑节点可访问哪些传感器感兴趣,因此您可以将
DISTINCT
添加到 RETURN
语句中,并且将使用更快的 VarLengthExpand(Pruning,BFS)
运算符进行规划:
MATCH (:Resource {uri:"building_id_a"})-[*..15]->(c:brick__Temperature_Sensor)
RETURN DISTINCT c.uri
如果这还不够,那么向您感兴趣的节点子集添加更具体的标签,以及仅过滤相关关系类型,也应该可以提高性能:
MATCH (:Resource {uri:"building_id_a"})-[:TYPES1|TYPE2|TYPES3 *..15]->
(c:Pump|Room|Temperature_Sensor)
RETURN DISTINCT c.uri