优化 Neo4j 查询或图形模型以在建筑层次结构中查找传感器

问题描述 投票:0回答:1

我正在使用一个代表建筑物层次结构的 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 节点的图片以了解更多背景信息:

我将非常感谢您提供的任何意见。请随时分享您的想法或建议。谢谢你!另外,如果需要的话我可以提供更多信息

charts neo4j graphql query-optimization
1个回答
0
投票

由于您只对从给定建筑节点可访问哪些传感器感兴趣,因此您可以将

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
© www.soinside.com 2019 - 2024. All rights reserved.