Skip To Content

查询知识图谱

您可以查询知识图谱以找到其包含的实体和关系的子集,并确定不同实体的连接方式。 可以使用出处记录并(可选)将其包含在查询结果中。 请参阅以下示例:

  • 从代表传染病传播的知识图谱中,使用通过与给定设施点的任何关系关联的人类及动物。
  • 从代表制造供应链的知识图谱中,使用与特定部分相关联的任何内容,包括供应商、交付方式、仓库等。
  • 从代表组织的知识图谱中,使用给定类型的设备,并列出其属性,包括负责员工的姓名。
  • 在表示乌龟及其栖息地的知识图谱中,识别栖息地,其中使用特定环境影响评估中的信息建立风险等级。

您可以通过查询知识图谱来识别实体和关系的子集或其属性。 使用 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,e2MATCH (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 数据存储创建知识图谱时,有多个选项可用于存储时态数据,包括 ArcGIS Enterprise 11.2 和以后的版本。 在存储和查询时态数据时,必须考虑事件的位置以及访问数据的人员的位置。

如果要存储本地数据并在同一地区使用,则可以存储日期和时间信息,无需考虑时区。 这些数据可存储在日期数据类型的属性中。 当数据来自或从不同时区查询时,必须注意确保根据您的位置和时区存储和查询正确的值。 使用时间戳偏移数据类型的属性可以记录日期时间值,这些值应考虑到事件发生的时区和使用数据的时区。

您可以使用 openCypher 查询访问知识图谱中存储的日期和时间值。 要获得正确的结果,必须使用特定函数来查询每种数据类型的属性,如下表所述。 使用其他功能可能会导致错误或意外结果。 在向查询提供或由查询返回时间值时,时间值将始终使用 ISO 8601 日期-时间格式。

字段类型函数语法示例

日期

localdatetime()

localdatetime('YYYY-MM-DDThh:mm:ss.sss')

localdatetime('2015-07-24T21:40:53.142')

仅日期

date()

date('YYYY-MM-DD')

date('2015-07-24')

仅时间

localtime()

localtime('hh:mm:ss.sss')

localtime('21:40:53.142')

时间戳偏移

datetime()

datetime('YYYY-MM-DDThh:mm:ss.sssZ') 或 datetime('YYYY-MM-DDThh:mm:ss.sss+00:00')

datetime('2015-07-24T21:40:53.142Z') 或 datetime('2015-07-21T21:40:53.142-08:00')

要使用时间戳偏移数据类型评估知识图谱属性,请在 openCypher 查询中使用 datetime() 函数。 当指定值为协调世界时间 (UTC) 时,使用日期-时间 YYYY-MM-DDThh:mm:ss.sssZ 格式。 如果数值是当地时间的日期,并带有适当的时区偏移,则使用该格式 YYYY-MM-DDThh:mm:ss.sss+00:00。 如果在查询中提供日期时间值时,日期时间值的重要部分被忽略,查询将返回错误。

例如,要查找特定时间后购买的所有车辆,使用像 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 Enterprise11.3 开始,openCypher 查询可以使用时间长度来评估知识图谱中的时间值。 这样就可以了解数据点之间的时间差。 您可以找到属性中记录的事件持续一段时间的实体和关系,或者事件之间间隔一定时间的实体和关系。

当查询提供或返回时间长度时,总是使用 ISO 8601 时间长度格式。 例如,P1Y2M3DT4H5M6S 表示一年、两个月、三天、四小时、五分钟和六秒的时间间隔。 如果持续时间的部分值为零,则可以省略。 例如,一天半的时间段可以表示为 P1DT12H 或 PT36H。 如果持续时间字符串包含时间组件,则必须在日期组件之后、时间组件之前指定字符 T。

如下所述,有几种持续时间函数可用于计算两个时间之间的周期。 如有需要,可按具体时间单位计算持续时间。

  • duration.between(a, b)—时间 a 和时间 b 之间相隔的时间。 返回的时间长度说明了以年、月、日等表示的全部时间。
  • duration.inMonths(a, b)—时间 a 和时间 b 之间的时间间隔计算为整月数,并作为时间长度返回。 小于整月的时间会被舍弃。
  • duration.inDays(a, b)—时间 a 和时间 b 之间的时间间隔计算为整天数,并作为时间长度返回。 小于整天的时间会被舍弃。
  • duration.inSeconds(a, b)—时间 a 和时间 b 之间的时间间隔计算为整秒数,并作为时间长度返回。 小于整秒的时间会被舍弃。

例如,要查找出售了拥有不到两年的车辆的人,请使用如 MATCH path=(:Person)-[hv:HasVehicle]->(:Vehicle) WHERE hv.endDate < (hv.acquisitionDate + duration('P2Y')) RETURN path, duration.between(hv.acquisitionDate,hv.endDate) as TimeOwned 的查询。 如果 HasVehicle 关系具有 endDate 属性,且 endDate 和 acquisitionDate 属性之间的持续时间少于两年,则会返回所有路径。 该查询同时返回车辆的路径和拥有时间。

在计算持续时间时,您可以通过在适当位置提供日期-时间函数,指定当前日期或时间作为两个时间瞬时之一。 此外,还可以在查询中访问和返回或使用持续时间的部分内容。 下面的示例指明了购买车辆超过四年的人:MATCH path=(:Person)-[hv:HasVehicle]->(:Vehicle) WHERE duration.between(hv.acquisitionDate, datetime()).years > 4 RETURN path 通过提供函数 datetime() 而非具体日期,就可以在查询中使用当前日期-时间。 然后,对计算出的持续时间中的年份部分进行访问和评估,以找到合适的路径。 通过这种方式可以访问持续时间的所有部分,包括天、小时、分钟等。

还可以计算相关方之间发生的事件的持续时间。 例如,以下查询对知识图谱进行了评估,以确定电话实体与被叫关系之间的关系,以及两次电话通话之间的时间间隔:MATCH (:Phone)-[c1:Called]-(:Phone)-[c2:Called]-(:Phone) WHERE duration.between(c1.datecalled, c2.datecalled).minutes < 45 RETURN c1, c2。 在该查询中,持续时间计算的是从手机接听一个电话到拨打第二个电话之间的时间。 通过评估持续时间的分钟属性,如果两次通话之间的时间间隔少于 45 分钟,则查询会将第一次和第二次通话都返回。

在查询中使用出处记录

使用托管图谱存储或包含 ArcGIS 管理数据的 NoSQL 数据存储创建知识图谱时,可以启用出处。 出处记录用于指明知识图谱的内容源自何处。 您可以指定实体或管理属性中存储的值派生自特定文档或网站。 可稍后在查询知识图谱时使用该信息。 您可以查找属性值源自特定信息源的实体和关系。

默认从所有查询中排除出处记录。 在 ArcGIS Pro 中,您必须选中包含出处选项才能在查询中使用出处记录中存储的信息并在查询结果中包含出处记录。 如果您使用其中一个可用的开发人员 API 创建了可与 ArcGIS Knowledge Server 站点进行通信的自定义应用程序,则您的客户端应用程序必须指定查询结果应包含出处记录。

查询必须通过比较图谱项目的实例标识符与出处记录中存储的实例标识符,确定哪些实体和关系具有与出处记录有关的属性。 查询还可以评估图谱项目和出处记录的属性以获取结果。 可以选择将出处记录本身或其属性包含在查询结果中。

例如,要查找所有车辆的车主,其中加州机动车辆管理局为 HasVehicle 管理属性中存储的信息来源,使用 MATCH (p:Person)-[hv:HasVehicle]->(v:Vehicle), (pr:Provenance) WHERE ID(hv)=pr.instanceID and pr.sourceName ="California Department of Motor Vehicles" RETURN p,hv,v,pr 等查询。 该查询会通过比较关系的实例标识符和出处记录的 instanceID 属性,来评估哪些 HasVehicle 关系具有出处记录。 评估的出处记录仅为记录的 sourceName 属性具有适当值的记录。 此外,还会在查询结果中包含与找到的 HasVehicle 关系关联的人和车辆实体以及出处记录本身。

在查询中使用空间运算符

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。 在搜索和过滤窗格的直方图选项卡 直方图 上,单击设置按钮 设置,然后单击将查询发送到“查询”选项卡。 用于检索当前直方图集数据的查询出现在查询文本框中。