基于自环边的查询

如图所示:


自环边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 虽然不是直接解决您问题的特性,但它们增强了查询的表达能力和性能,可以在更复杂的场景中使用。