Cayley图数据库MQL查询语言指南
2025-07-06 01:47:40作者:何将鹤
概述
Cayley图数据库实现了一种基于JSON的查询语言MQL(Metaweb Query Language),这是对Freebase MQL API的部分兼容实现。MQL允许开发者以直观的JSON格式表达图数据查询,特别适合处理复杂的关联关系数据。
MQL基础概念
基本查询结构
在MQL中,每个JSON对象代表图中的节点,而将对象包裹在数组中表示可能存在多个这样的节点。最基本的查询形式如下:
[{
"id": null
}]
这个查询会返回图中的所有节点,其中id
是特殊关键字,表示节点的值。
谓词约束
通过添加谓词(predicate)可以对查询施加约束条件:
[{
"id": null,
"name": "Alice"
}]
这个查询会返回所有具有name
属性且值为"Alice"的节点。
谓词可以接受多种类型的值:
- 对象或对象数组(子查询)
- 字符串和数字(必须匹配的字面量ID)
- null值(表示必须存在匹配的谓词,但匹配值将替换null)
核心特性
反向谓词
默认情况下,谓词采用正向方向。例如:
[{
"id": "A",
"knows": "B"
}]
这匹配的是三元组 A knows B
。
要查询反向关系,可以使用!
前缀:
[{
"id": "A",
"!knows": "B"
}]
这将匹配三元组 B knows A
。
多重谓词
JSON规范不定义具有相同键的对象的处理方式。为了对同一谓词施加多个约束,可以使用@name:
前缀:
[{
"id": "A",
"@x:knows": "B",
"@y:knows": "C"
}]
这将匹配同时存在 A knows B
和 A knows C
的情况。
反向规则可以与命名前缀结合使用,形成如 "@a:!knows"
这样的复杂路径查询。
查询示例
简单节点查询
查找所有节点:
[{
"id": null
}]
带属性约束的查询
查找名为"Bob"的所有节点:
[{
"id": null,
"name": "Bob"
}]
关系查询
查找认识"Alice"的所有人:
[{
"id": null,
"!knows": "Alice"
}]
复杂条件查询
查找同时认识"Alice"和"Bob"的人:
[{
"id": null,
"@x:knows": "Alice",
"@y:knows": "Bob"
}]
注意事项
- Cayley的MQL实现目前是Freebase MQL的一个子集,不支持所有高级特性
- 当前版本不包含Freebase的schema推断功能
- 设计目标是数据库无关性,可以在不同后端上运行相同的查询
MQL提供了一种直观的方式来查询图数据,特别适合处理复杂的关联关系。通过组合基本查询元素,可以构建出强大的图模式匹配查询。