如图所示:
自环边edgeType 有部分属性(链接,状态,附件…),点 TAG 有部分属性(ID,名称),关联边edgeType(引用) 有部分属性,这些属性均关联点的业务主键ID,现在问题是如何高效快速的过滤匹配满足指定属性值列表的查询点?
比如根据查询条件链接为a,状态为非空,名称为测试点A,引用为非空来查询出点A
如图所示:
索引使用:
对于高效的属性过滤,建议在相关属性上创建索引。根据您的描述,您可以为 链接、状态、名称 和 引用 创建索引。
CREATE TAG INDEX idx_tag_name ON player(name(20));
CREATE EDGE INDEX idx_edge_link ON edgeType(link(20));
CREATE EDGE INDEX idx_edge_status ON edgeType(status);
CREATE EDGE INDEX idx_edge_reference ON edgeType(reference);
注意:括号中的数字表示索引字段的长度,根据实际数据长度调整。
使用 MATCH 语句:
MATCH 语句提供了强大的模式匹配能力,可以结合 WHERE 子句来过滤数据。
MATCH (v:player)
WHERE v.name == "测试点A"
AND EXISTS {
MATCH (v)-[e:edgeType]->(v)
WHERE e.link == "a" AND e.status IS NOT NULL
}
AND EXISTS {
MATCH (v)-[r:引用]->()
WHERE r IS NOT NULL
}
RETURN v;
解释:
第一部分 WHERE v.name == “测试点A” 过滤点。
EXISTS 用于检查自环边和关联边的存在和属性条件。
优化查询性能:
如果你的查询涉及大量数据,可以考虑以下优化:
使用 LIMIT 来减少返回结果的数量。
使用 Hint 指示 NebulaGraph 优化器如何处理查询,如 /*+ Index(v idx_tag_name) */ 以指定索引使用。
性能考虑:
在执行复杂的 MATCH 查询时,考虑查询计划(使用 PROFILE 或 EXPLAIN)来识别性能瓶颈。
PROFILE MATCH (v:player)
WHERE v.name == "测试点A"
AND EXISTS {
MATCH (v)-[e:edgeType]->(v)
WHERE e.link == "a" AND e.status IS NOT NULL
}
AND EXISTS {
MATCH (v)-[r:引用]->()
WHERE r IS NOT NULL
}
RETURN v;
版本特性利用:
SINGLE SHORTEST PATH 和 INNER JOIN 虽然不是直接解决您问题的特性,但它们增强了查询的表达能力和性能,可以在更复杂的场景中使用。