openCypher (预览版)

适用于:✅Azure 数据资源管理器

openCypher 是用于查询属性图形数据库的 开源规范 。 现在,可以使用具有 ASCII 艺术样式模式匹配的声明性语法对 KQL 图形语义运行 openCypher 查询,以便直观地表达复杂的图形模式和关系。

注释

openCypher 支持处于预览状态。 功能和语法可能会根据反馈和正在进行的开发而变化。

入门指南

若要使用 openCypher,需要:

  • 图形数据源,该数据源是 图形模型 或返回以 生成图形 运算符结尾的暂时性图形的函数(请参阅步骤 1)
  • 设置特定的客户端请求属性(请参阅步骤 2)

步骤 1:创建图形引用

在使用 openCypher 之前,请创建图形数据源。 本文使用内存中生成图形运算符,但我们建议对生产方案使用图形快照。

.create-or-alter function G_doc() {
    let nodes = datatable(id:string, lbl:string, name:string, properties:dynamic)
    [
        "p1","Person","Alice",dynamic({"age": 25}),
        "p2","Person","Bob",dynamic({"age": 30}),
        "p3","Person","Carol",dynamic({"age": 28}),
        "p4","Person","David",dynamic({"age": 35}),
        "p5","Person","Emma",dynamic({"age": 26}),
        "c1","Company","TechCorp",,
        "c2","Company","DataSoft",,
        "c3","Company","CloudInc",,
        "ct1","City","Seattle",,
        "ct2","City","Portland",,
        "ct3","City","San Francisco",
    ];
    let edges = datatable(source:string, target:string, lbl:string, since:int)
    [
        "p1","c1","works_at",2020,
        "p2","c1","works_at",2022,
        "p3","c2","works_at",2023,
        "p4","c3","works_at",2021,
        "p5","c1","works_at",2024,
        "p1","ct1","located_at",2019,
        "p2","ct1","located_at",2021,
        "p3","ct2","located_at",2022,
        "p4","ct3","located_at",2020,
        "p5","ct2","located_at",2023,
        "c1","ct1","located_at",2015,
        "c2","ct2","located_at",2018,
        "c3","ct3","located_at",2017,
        "p1","p2","knows",2019,
        "p2","p3","knows",2021,
        "p3","p4","knows",2022,
        "p4","p5","knows",2023,
        "p1","p4","likes",2020,
        "p4","p1","likes",2020,
        "p5","p2","likes",2022
    ];
    edges
    | make-graph source --> target with nodes on id
}

步骤 2:配置客户端请求属性

若要运行 openCypher 查询,请设置三个客户端请求属性。 使用指令通过 SDK、API 或直接在 Kusto 资源管理器Azure 数据资源管理器 Web UI 中设置这些属性。

设置客户端请求属性

重要

在运行 openCypher 查询之前单独运行每个指令。 指令为 openCypher 执行设置查询环境。

#crp query_language=opencypher
#crp query_graph_reference=G_doc()

若要在 openCypher 中使用标签,请设置标签列名称:

#crp query_graph_label_name=lbl

小窍门

标签在 openCypher 中是可选的,但它们通常用于按类型筛选节点和边缘。 设置标签列名称以在 openCypher 查询中使用标签。

以编程方式设置客户端请求属性

对于编程访问,请设置以下客户端请求属性:

  • query_language:设置为 "opencypher".
  • query_graph_reference:设置为图形函数名称(例如 "G_doc()")。
  • query_graph_label_name:设置为标签列名称(例如 "lbl")。

步骤 3:运行 openCypher 查询

完成设置后,使用标准语法运行 openCypher 查询。 使用以下示例浏览基本的 openCypher 功能。

例子

以下示例演示核心 openCypher 查询模式。 openCypher 使用 ASCII 艺术样式语法,其中节点用括号 () 和方括号 [] 中的箭头 --><-- 指示方向的关系来表示。

示例 1:基本模式匹配

查找图形中的所有关系并对其进行计数。

MATCH (n)-[e]->(n2)
RETURN COUNT(*) as CNT

输出

下表显示了查询的结果。

CNT
20

此查询通过关系n匹配连接到另一个节点的任何节点n2e,并返回此类模式的总计数。

示例 2:与标签匹配的模式

查找人员及其连接,按节点标签进行筛选。

MATCH (p:Person)-[e]->(target)
RETURN p.name, target.name, e.lbl
ORDER BY p.name, target.name
LIMIT 2

输出

下表显示了查询的结果。

p.name target.name e.lbl
爱丽丝 鲍勃 知道
爱丽丝 大卫 喜欢

此查询查找所有 Person 节点并返回其名称、已连接节点的名称和关系类型。 标签 :Person 将源节点筛选为仅匹配 Person 节点。

示例 3:使用 WHERE 子句进行筛选

查找 25 岁以上的人并返回其详细信息。

MATCH (person:Person)
WHERE person.properties.age > 25
RETURN person.name, person.properties.age
ORDER BY person.name

输出

person.name person.properties.age
鲍勃 30
颂歌 28
大卫 35
艾玛 26

此查询演示如何使用 WHERE 子句筛选属性来查找年龄属性大于 25 的人员。

示例 4:可变长度路径

查找从 Alice 到达 1 到 3 个跃点的所有人员。

MATCH (center)-[*1..3]->(connected:Person)
WHERE center.name = 'Alice'
RETURN DISTINCT connected.name
ORDER BY connected.name

输出

connected.name
爱丽丝
鲍勃
颂歌
大卫
艾玛

此查询使用可变长度路径 [*1..3] 查找从 Alice 访问的所有人员,通过一到三个跃点。 关键字 DISTINCT 可确保每个连接的节点仅显示一次。

示例 5:聚合和分组

统计每个公司有多少人工作。

MATCH (person:Person)-[:works_at]->(company:Company)
RETURN company.name AS Company, COUNT(person) AS EmployeeCount
ORDER BY EmployeeCount DESC

输出

公司 EmployeeCount
TechCorp 3
CloudInc 1
DataSoft 1

此查询通过按公司对人员进行分组和对每个公司的员工进行计数来演示聚合。 语法 [:works_at] 按类型筛选关系。

局限性

openCypher 支持具有以下限制:

  • 查询结构:所有 openCypher 查询都必须以 MATCH 语句开头。

  • 不支持的语言构造:当前不支持以下 openCypher 语言构造:

    • WITH 子句:查询组合不支持
    • 子查询:包括 EXISTS 子查询和模式谓词
  • 不支持的关键字:不支持以下 openCypher 关键字:

    • MANDATORY MATCH
    • UNWIND
    • UNION
    • SKIP
  • 不支持的标量函数:尚未实现以下 openCypher 标量函数:

    • 数学函数:sin()、、cos()tan()log()round()、、 sign()rand()
    • 统计函数:percentileDisc()、、percentileCont()stDev()stDevP()
    • 实用工具函数:coalesce()、、id()properties()type()range()
    • 事例表达式: CASE 语句
  • 部分支持CALL 过程仅具有部分支持。

  • 保留关键字:某些 openCypher 关键字不能用作查询中的标识符。 某些保留关键字并不立即明显。 如果图形数据具有与 openCypher 保留关键字冲突的属性名称,请在图形架构中使用不同的属性名称或重命名它们以避免分析冲突。

    重要

    设计图形架构时,某些常见属性名称可能与 openCypher 保留关键字冲突。 请避免或重命名这些属性名称。

  • 不支持任何图形修改作:不支持更改图形结构(如CREATEMERGEDELETESETREMOVE)的作。 对所有图形创建、更改和管理任务使用 KQL。

  • 可选模式匹配OPTIONAL MATCH 仅支持节点模式,而不支持边缘模式。

  • 实体等效性检查:不支持使用节点或关系等运算符(=<>例如,MATCH (n)-[]-(m) WHERE n <> m)进行实体等价检查。 请改用显式字段比较,例如 n.id <> m.id

  • 时间和时区:引擎以 UTC 方式运行。 日期/时间文本必须使用适当的格式;仅支持 UTC 时区。