您可以查询知识图谱以找到其包含的实体和关系的子集,并确定不同实体的连接方式。 请参阅以下示例:
- 从代表传染病传播的知识图谱中,使用通过与给定设施点的任何关系关联的人类及动物。
- 从代表制造供应链的知识图谱中,使用与特定部分相关联的任何内容,包括供应商、交付方式、仓库等。
- 从代表组织的知识图谱中,使用给定类型的设备,并列出其属性,包括负责员工的姓名。
您可以通过查询知识图谱来识别实体和关系的子集或其属性。 使用 openCypher 查询语言编写 openCypher 查询以发现相关实体及其属性,并在知识图谱、地图或链接图表使用这组受限制的信息。
编写 openCypher 查询
openCypher 查询之于图谱数据库就像 SQL 查询之于关系数据库。 查询的基本结构是查找或匹配实体并返回这些实体,您要查找的实体将在括号中标识。 例如,查询 MATCH (e) RETURN e 可返回任意类型的实体。 返回的实体数量仅受限于知识图谱配置。 要限制返回的图谱项目数量,请使用 LIMIT 表达式。 例如,查询 MATCH (e) RETURN e LIMIT 5 可返回五个任意类型的实体。
查询可以识别使用组成箭头的符号关联的实体。 例如,查询 MATCH (e1)-->(e2) RETURN e1,e2 将返回实体对 e1 和 e2,其中两个实体之间存在任意类型的关系,并且从实体 e1 到实体 e2 的路径均连接实体。 如果在编写查询时使用指向另一个方向的箭头,则路径将被视为从初始实体 e2 开始到目标实体 e1:MATCH (e1)<--(e2) RETURN e1,e2。 实体之间相互关联的方式称为模式。
查询可以识别特定关系,这些关系应采用方括号括起来。 例如,查询 MATCH (e1)-[]->(e2) RETURN e1,e2 将返回实体对 e1 和 e2,其中任意类型的单个关系连接两个实体。 此查询显示了表示上述相同查询的另一种方式,并演示了首选查询语法。 查询可以更改为返回描述关系的整个元组,方法是返回初始实体 e1、关系 r 和目标实体 e2,如下所示:MATCH (e1)-[r]->(e2) RETURN e1,r,e2。 类似查询 MATCH (e1)-[ ]->( )-[ ]->(e2) RETURN e1,e2 或 MATCH (e1)-[*2]->(e2) RETURN e1,e2 将返回由两个相同方向的关系连接的实体对。 查询还可以识别关系具有不同方向的模式,例如 MATCH (e1)-[ ]->(e2)<-[ ]-(e3) RETURN e1,e2,e3。
上方示例查询可用于任意知识图谱。
通过引用在数据模型中定义的实体类型、关系类型和属性,可以定制针对特定知识图谱的查询。 在查询中包含特定实体类型的名称,以限制所考虑的图谱项目。 例如,查询 MATCH (e1:Person)-[r]->(e2) RETURN e1,r,e2 将返回满足以下条件的所有 Person 实体 e1:任意关系 r 将 Person 连接至另一个实体 e2(可为任何类型的实体)。 与之前的示例相比,Pet、Vehicle 或 Document 实体作为初始实体的关系不包含在结果中。
您可以将查询限制为考虑特定的关系类型和特定的关联实体,方法是在查询的其他部分添加关系类型和实体类型。 例如,MATCH (p:Person)-[v:HasVehicle]->(e) RETURN p,v,e 将返回满足以下条件的所有 Person 实体 p:HasVehicle 关系 v 将 Person 连接到另一个任意类型的实体 e。 由于变量 p 和 v 将分别分配给 Person 实体和 HasVehicle 关系,因此查询可以返回有关它们的信息。 与之前的示例相比,Pet 或 Document 实体作为目标实体的关系不包含在结果中。 目标实体 e 可能是常规的 Vehicle 实体,也可能是一系列特定的实体类型之一(例如 Automobile、Motorcycle、Boat、Airplane、Commercial Vehicle 等),具体取决于知识图谱的数据模型。
查询结果中可以包含特定的实体和关系属性。 例如,MATCH (p:Person)-[:HasVehicle]->(e) RETURN p,e.make,e.model,e.year 将运行的查询与之前定义的查询相同。 但是,结果将分别显示存储在多个实体属性中的值(车辆的品牌、型号和年份),而不是显示目标实体本身。 在此示例中,没有为查询考虑的特定关系分配变量,因为关系的数据未包含在查询结果中或未在查询的其他位置进行评估。
同样,您可以通过指定定义感兴趣的实体和关系的属性来约束评估的实体和关系。 可以通过向查询添加 WHERE 子句来定义要考虑的属性。 对于以上示例,必须分配变量以引用有关 WHERE 子句中的实体和关系的特定信息。 例如,在以下查询中,仅会评估具有特定的 lastName 属性值的 Person 实体;仅在 HasVehicle 关系的 endDate 属性具有 NULL 值时考虑该关系;并且仅在相关的 Vehicle 实体的年份属性值早于 1980 时考虑该实体:MATCH (p:Person)-[hv:HasVehicle]->(v:Vehicle) WHERE p.lastName = 'Doe' and hv.endDate IS NULL and v.year < 1980 RETURN p,p.firstName,v,v.make,v.year。
您的查询可以返回由模式表示的完整路径,而非返回一系列单独的实体和关系。 为此,请将在 MATCH 语句中定义的模式分配给某个变量,然后返回该变量。 例如,查询 MATCH path = (:Person)-[:HasVehicle]->(:Vehicle) RETURN path 将返回满足指定模式的所有实体和关系组合的路径列表。 每条路径将包含匹配模式的所有部分:Person、HasVehicle 关系和 Vehicle。 您无需将变量分配给此模式的各个部分,因为该查询不会返回这些部分。
在查询中使用日期时间值
使用托管图谱存储或包含 ArcGIS 管理数据的 NoSQL 数据存储创建知识图谱时,始终需要采用协调世界时间 (UTC) 格式提供日期时间值。 同样,如果查询返回了日期时间值,则这些值始终以 UTC 时间格式提供。 即,在实体或关系属性中存储的日期时间值不能与特定时区相关联。 提供值时,日期时间原样存储。 即,知识图谱不会自动将采用本地时间格式提供的值转换为 UTC 格式。 必须自行转换并存储正确的值,以免稍后查询知识图谱时出现问题。
例如,如果收集有关特定事件的数据,则编辑知识图谱的所有人需要以适当的 UTC 时间格式提供与该事件相关的日期时间值。 位于不同时区的编辑者不应提供与其本地时区相关的日期时间值。 通常,当查询知识图谱时,查询应参考与事件相关的对应 UTC 时间,而不是您所在时区的本地时间。 这样,所有人都会存储正确的值并能够查询正确的值,无论其实际位置和本地时间为何。
要使用日期属性中存储的值查询知识图谱,必须使用 datetime() 实用程序,该程序会将提供的值解释为日期。 指定使用日期时间格式 YYYY-MM-DDThh:mm:ss.sssZ 的值,指示提供的日期时间为 UTC 时间。 使用日期时间格式 YYYY-MM-DDThh:mm:ss.sss+00:00 指示提供的日期为具有适当时区偏移的本地时间。 必须以 ISO 格式和指定时区提供完整的日期时间值。 如果忽略了日期时间的一些部分或如果忽略了时区,则查询将返回一条错误。
例如,要查找特定日期时间后购买的所有车辆,使用像 MATCH path=(:Person)-[hv:HasVehicle]->(:Vehicle) WHERE hv.acquisitionDate > datetime('2014-10-18T12:36-08:00') RETURN path 这样的查询。 在返回的所有路径中,HasVehicle 关系的 acquisitionDate 属性值均在 2014 年 10 月 18 日太平洋标准时间下午 12:36 之后;太平洋标准时间比 UTC 时间晚八小时。
要查找 1998 年购买的所有车辆,使用像 MATCH path=(:Person)-[hv:HasVehicle]->(:Vehicle) WHERE hv.acquisitionDate > datetime('1998-01-01T00:00Z') and hv.acquisitionDate < datetime('1998-12-31T23:59Z') RETURN path 这样的查询。 在返回的所有路径中,HasVehicle 关系的 acquisitionDate 属性值介于 1998 年 1 月 1 日和 12 月 31 日午夜 (UTC)。
目前,ArcGIS Knowledge 不支持使用时间间隔或时间段查询知识图谱。
在查询中使用空间运算符
ArcGIS Knowledge 支持在点、多点、线和面几何 openCypher 查询中使用空间运算符。 这些几何类型同样适用于在使用托管图谱存储或具有 ArcGIS 托管数据的 NoSQL 数据存储的知识图谱中创建的实体类型。 如果知识图谱使用包含用户管理数据的 NoSQL 数据存储,则可能支持其他几何类型。
支持以下空间运算符:
- ST_Equals - 返回几何相同的实体。 语法为 esri.graph.ST_Equals(geometry1, geometry2)。
- ST_Intersects - 返回几何相交的实体 语法为 esri.graph.ST_Intersects(geometry1, geometry2)。
- ST_Contains - 返回几何包含在指定几何内的实体。 语法为 esri.graph.ST_Contains(geometry1, geometry2)。
可以将空间运算符包含在查询的 WHERE 子句中。 几何参数可以引用实体几何或可以指定表示空间位置的几何。 可以使用运算符 esri.graph.ST_WKTToGeometry(string) 基于字符串构造几何,其中,字符串参数为以熟知文本格式指定的 OGC 简单要素。 例如,要创建表示坐标 117.1964763°W 34.0572046°N 的几何,需要使用运算符 esri.graph.ST_WKTToGeometry("POINT (-117.1964763 34.0572046)")。 以此方式构造的几何只能在空间运算符的第一个几个参数中指定。 第二个几何参数一定要引用与知识图谱中的实体相关联的几何。
假设在以下示例中,Person 类型的实体可以具有点几何,Facility 类型的实体可以具有面几何:
- 查询 MATCH (p1:Person), (p2:Person) WHERE esri.graph.ST_Equals(p1.shape, p2.shape) RETURN p1, p2 会返回形状相同的 Person 实体 p1 和实体 p2;即这两个 Person 实体具有相同的位置几何。
- 查询 MATCH (e:Employee), (f:Facility) WHERE esri.graph.ST_Intersects(e.shape, f.shape) RETURN e, f 会返回 Employee 实体 e 和 Facility 实体 f,其中 Employee 和 Facility 实体的几何相交。
- 查询 MATCH (f:Facility) WHERE esri.graph.ST_Contains(esri.graph.ST_WKTToGeometry("POINT (-117.1964763 34.0572046)"), f.shape) RETURN f 会返回 Facility 实体 f,该实体的几何包含指定点。
还可使用空间实用程序 ST_GeoDistance,其语法为 esri.graph.ST_GeoDistance(geometry, geometry)。 该实用程序会返回两个几何之间的距离。 例如,在查询 MATCH (n), (e) WHERE esri.graph.ST_GeoDistance(n.shape, e.shape) as distance RETURN n, e 中,WHERE 子句中的距离变量用于存储在实体 n 和 e 之间计算的测地线距离。
了解有关 openCypher 查询的详细信息
可以使用 openCypher Implementers Group 提供的文档了解有关 openCypher 查询语言的详细信息。 ArcGIS Knowledge 不支持 openCypher 查询语言的所有方面。 例如,查询不能用于更新知识图谱,只能用于返回值。
在 ArcGIS Pro 中,您可以通过查看从知识图谱中检索数据以构建直方图的查询来了解 openCypher。 在搜索和过滤窗格的直方图选项卡 上,单击设置按钮 ,然后单击将查询发送到“查询”选项卡。 用于检索当前直方图集数据的查询出现在查询文本框中。