使用 Gramps 对象查询语言进行过滤¶
对象列表视图(人员、家庭、事件等)和任务列表都有一个用于表达式的过滤字段,使用Gramps 对象查询语言(GOQL)。
要使用它,请打开过滤面板,在 GOQL 字段中输入表达式并按 Enter(或单击 应用)。列表将根据该表达式进行过滤,叠加在任何其他活动过滤器之上。如果表达式无效,该字段将标记为错误。
该表达式始终适用于您所在列表的对象:在人员列表中,surname == 'Smith' 查找姓氏为 Smith 的人员。
Note
GOQL 字段需要 Gramps Web API 3.24 或更高版本。
语法¶
GOQL 表达式看起来像 Python 编程语言中的条件。您不需要了解 Python 就可以使用它——下面的示例涵盖了大多数需求。
比较¶
比较的形式为 field operator value,例如 surname == 'Smith'。
| 操作符 | 意义 |
|---|---|
== |
等于 |
!= |
不等于 |
<, <= |
小于,小于或等于(较早,较小) |
>, >= |
大于,大于或等于(较晚,较大) |
in [ ... ] |
是列出值之一,例如 surname in ['Meyer', 'Maier'] |
not in [ ... ] |
不是列出值之一 |
'text' in field |
字段包含文本,例如 'mill' in surname |
is None |
字段为空或不存在,例如 death.date.sortval is None |
文本用单引号或双引号括起来('Smith'),数字则不需要(1850)。比较可以链接,例如 Date('1850') <= birth.date.sortval < Date('1900')。
组合条件¶
条件可以使用 and 和 or 组合,并使用 not 进行反转。and 的优先级高于 or;使用括号来分组条件:
(gender == Person.MALE and surname == 'Smith') or given_name == 'Mary'
文本模式¶
like(field, 'pattern')匹配一个模式,其中%代表任何文本,_代表单个字符,例如like(given_name, 'J%')用于所有以 "J" 开头的名字。regex(field, 'pattern')匹配一个正则表达式,例如regex(surname, '^M[ae][iy]er$')。
like 和 'text' in field 忽略大小写(在 SQLite 上,这仅适用于不带重音的字母 A–Z)。regex 是区分大小写的。
字段¶
字段是对象属性的名称,如 gender 或 gramps_id,或嵌套属性的路径,如 primary_name.first_name 或 primary_name.surname_list[0].surname。方括号通过位置选择列表中的元素,从 0 开始。可用的属性是Gramps 数据模型中的属性。如果字段不存在,错误消息将列出存在的字段。
有一些快捷方式可用:
- 人员有
given_name和surname,即主要名称的名字和姓氏。 - 人员有
birth和death,即他们的出生和死亡事件,例如birth.date.sortval或death.place.name.value。 - 家庭有
father和mother,例如father.surname == 'Smith'。 - 事件有
place,引用有source,地点有enclosed_by,即包围地点。
这些可以链接,例如在家庭列表中使用 father.birth.place.name.value。两个字段也可以相互比较,例如 father.surname == mother.surname。
相关对象列表¶
any(collection, condition) 如果集合中的至少一个项目满足条件,则匹配,len(collection) 计算项目数量。没有条件时,any(collection) 如果集合不为空则匹配。集合包括:
- 几乎每个对象都有的:
notes、citations、media和tags - 人员:
events、families(作为伴侣)、parent_families(作为子女)和associations - 家庭:
children - 所有对象:
backlinks,指向它的对象,可以通过_class测试其类型,例如any(backlinks, _class == 'Person')
any 和 len 也适用于存储在对象本身中的列表,例如 alternate_names 或 primary_name.surname_list。
常量和类型¶
Gramps 的固定值作为常量可用,例如 Person.MALE、Person.FEMALE、Person.UNKNOWN,或置信度级别 Citation.CONF_VERY_LOW 到 Citation.CONF_VERY_HIGH。类型通过其 value 与常量进行比较,例如 EventType.BIRTH、FamilyRelType.MARRIED、NameType.BIRTH、PlaceType.VILLAGE 或 RepositoryType.ARCHIVE:
type.value == EventType.BAPTISM
您自己输入的自定义类型没有自己的常量。
日期¶
Date('...') 将以文本形式书写的日期转换为可以与日期的 sortval 进行比较的值,例如 birth.date.sortval < Date('1800')。
sortval 是一个时间点,忽略日期的类型和质量:“1800 年之前”、“约 1800 年”和“1800 年”都具有相同的 sortval,对于范围或跨度,它是开始。要考虑这些因素,可以将日期的 modifier 或 quality 与常量进行比较,例如 Date.MOD_ABOUT、Date.MOD_BEFORE、Date.MOD_AFTER、Date.MOD_RANGE、Date.MOD_SPAN 或 Date.QUAL_ESTIMATED:
date.modifier == Date.MOD_ABOUT
注释示例¶
人员列表:
gender == Person.FEMALE and like(given_name, 'Mar%')
名字以 "Mar" 开头的女性。
Date('1850') <= birth.date.sortval < Date('1900')
1850 年至 1899 年出生的人。
birth.place.name.value == death.place.name.value
在同一地点出生和去世的人。
not any(notes)
没有备注的人。
any(events, type.value == EventType.BURIAL)
有埋葬事件的人。
any(alternate_names, surname_list[0].surname == 'Meyer')
有替代名称且姓氏为 Meyer 的人。
家庭列表:
len(children) > 10
有超过 10 个孩子的家庭。
len(children, gender == Person.FEMALE) == 3
有三个女儿的家庭。
mother.death.date.sortval < father.death.date.sortval
母亲在父亲之前去世的家庭。
事件列表:
type.value == EventType.BAPTISM and place.name.value == 'Berlin'
在名为柏林的地方的洗礼。
引用列表:
confidence >= Citation.CONF_HIGH
置信度高或非常高的引用。
备注列表:
'David' in text.string and private == True
包含 "David" 的私人备注。
not any(backlinks)
未附加到任何对象的备注。
完整参考¶
有关完整的语言参考,请参见GOQL 文档。