Вы можете выполнить запрос к графу знаний, чтобы найти поднабор элементов и отношений, которые он содержит, и определить, как различные элементы связаны. При этом могут использоваться записи о происхождении, и записи о происхождении могут при необходимости включаться в результаты запроса. См. примеры ниже:
- На основе графа знаний, представляющего распространение инфекционного заболевания, можно работать с людьми и животными, связанными любыми отношениями с данным помещением.
- На основе графа знаний, представляющего производственную цепочку поставок, можно работать с любыми ресурсами, связанными с определенной ее частью, включая поставщиков, средства доставки, склады и так далее.
- На основе графа знаний, представляющего организацию, можно работать с устройствами заданного типа и получать список их свойств, включая имя ответственного сотрудника.
- На основе графа знаний, представляющего черепах и места их обитания, можно определить места обитания, где уровень риска был установлен на основе информации, содержащейся в специальной оценке воздействия на окружающую среду.
Вы можете определить поднабор элементов и отношений или их свойства, запросив граф знаний. Используйте язык запросов openCypher, чтобы писать запросы openCypher для обнаружения связанных элементов и их свойств, и для работы с этим ограниченным набором информации на графе знаний, карте или диаграмме связей.
Написание запроса openCypher
Запросы openCypher относятся к базам данных графов так же, как запросы SQL относятся к реляционным базам данных. Базовая структура запроса заключается в поиске или сопоставлении элементов и возвращении этих элементов, где элементы, которые вы хотите найти, указаны в круглых скобках. Например, запрос MATCH (e) RETURN e возвращает элементы любого типа. Количество возвращаемых элементов ограничено только конфигурацией графа знаний. Чтобы ограничить количество возвращаемых элементов графа, используйте выражение LIMIT. Например, запрос MATCH (e) RETURN e LIMIT 5 вернет пять элементов любого типа.
Запрос может идентифицировать элементы, связанные с помощью символов, образующих стрелку. Например, запрос MATCH (e1)-->(e2) RETURN 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. Например, в следующем запросе оцениваются только элементы Person с определенным значением свойства lastName; Отношения HasVehicle учитываются, только если они имеют значение NULL в свойстве endDate; и связанные элементы Vehicle учитываются только в том случае, если свойство year имеет значение, предшествующее 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. Вам не нужно назначать переменные отдельным частям этого шаблона, поскольку они не возвращаются запросом.
Использование значений дата-время в запросе
Когда вы создаете граф знаний, используя размещенное хранилище графов или хранилище данных NoSQL с данными, управляемыми ArcGIS, значения даты-времени всегда должны предоставляться в формате всемирного координированного времени (UTC). Аналогично, когда значения даты-времени возвращаются запросом, они всегда предоставляются в формате UTC. То есть, значения даты-времени, хранящиеся в свойстве элемента или отношения, не могут быть связаны с определенным часовым поясом. При предоставлении значения дата-время хранятся без изменений. То есть, граф знаний не преобразует значение, предоставленное в местном времени, автоматически в UTC. Вы должны сами выполнить конвертацию и сохранить правильное значение, чтобы избежать проблем при последующих запросах к графу знаний.
Например, если собираются данные о конкретном событии, каждый, кто редактирует граф знаний, должен предоставить значения даты-времени, относящиеся к этому событию, в формате соответствующего времени UTC. Редакторам, находящимся в разных часовых поясах, не следует указывать значение даты-времени, связанное с их местным часовым поясом. Аналогично, при запросе графа знаний запросы должны ссылаться на соответствующее время UTC, связанное с событием, а не на местное время вашего часового пояса. Таким образом, каждый будет хранить правильные значения и иметь возможность запрашивать правильные значения независимо от своего физического местоположения и местного времени.
Чтобы запросить граф знаний, используя значения, хранящиеся в свойствах даты, вы должны использовать утилиту datetime(), которая интерпретирует предоставленное значение как дату. Укажите значение, используя формат даты-времени YYYY-MM-DDThh:mm:ss.sssZ, чтобы указать, что предоставляемое время является временем UTC. Используйте формат даты-времени AAYYYY-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 со значением после 12:36 по Североамериканскому Тихоокеанскому Стандартному времени 18 октября 2014 года; тихоокеанское стандартное время отстает от 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 между 1 января и полуночью 31 декабря по UTC в 1998 году.
В настоящее время ArcGIS Knowledge не поддерживает запрос графа знаний с использованием временного интервала или периода времени.
Использование записей о происхождении в запросе
Когда вы создаете граф знаний, используя размещенное хранилище графов или хранилище данных NoSQL с данными, управляемыми ArcGIS, можно сделать доступными записи о происхождении. Записи о происхождении позволяют вам указывать информацию о происхождении данных. Вы можете указать, что значение, хранящееся в свойстве элемента или отношения, было получено из определенного документа или сайта. Эта информация может быть использована позже, когда вы сделаете запрос к графу знаний. Вы можете найти элементы и отношения со значениями свойства, которые были получены из определенного источника информации.
По умолчанию записи о происхождении исключены из всех запросов. В ArcGIS Pro вы должны отметить опцию Включить происхождение, чтобы указать информацию, хранящуюся в записях о происхождении, в запросе и включить записи о происхождении в результаты запроса. Если вы создали пользовательское приложение, которое взаимодействует с сайтом ArcGIS Knowledge Server с помощью одного их доступных API разработчика, ваши приложение клиент должно указать, что результаты запроса должны включать записи о происхождении.
Ваш запрос должен определить, какие элементы и отношения имеют свойства, связанные с записями о происхождении, путем сравнения идентификаторов экземпляров элементов графа с идентификаторами экземпляров, хранящимися в записях о происхождении. Для получения результатов запрос может также оценивать свойства элементов графа и записей о происхождении. Сами записи о происхождении или их свойства могут быть при необходимости включены в результаты запроса.
Например, чтобы найти владельцев всех автомобилей, для которых источником информации, хранящейся в свойствах отношения 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. Запрос оценивает, какие отношения HasVehicle имеют записи о происхождении, сравнивая идентификаторы экземпляров отношений со свойством instanceID записей о происхождении. Оцениваются только те записи, в которых свойство sourceName записи имеет соответствующее значение. Кроме того, в результаты запроса включаются элементы Person и Vehicle, связанные с найденными отношениями HasVehicle, а также сами записи о происхождении.
Использование пространственных операторов в запросе
ArcGIS Knowledge поддерживает использование пространственных операторов в запросах openCypher с геометрией точек, многоточий, линий и полигонов. Это те же типы геометрии, которые поддерживаются для типов элементов, созданных в графе знаний с помощью размещенного хранилища графов или хранилища данных NoSQL с данными, управляемыми ArcGIS. Если ваш граф знаний использует хранилище данных 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)"). Геометрия, построенная таким образом, может быть указана только в первом аргументе геометрии для пространственных операторов. Второй аргумент геометрии всегда должен ссылаться на геометрию, связанную с элементом в графе знаний.
Рассмотрим следующие примеры, в которых элементы типа Персона могут иметь геометрию точки, а элементы типа Здание — геометрию полигона:
- Запрос MATCH (p1:Person), (p2:Person) WHERE esri.graph.ST_Equals(p1.shape, p2.shape) RETURN p1, p2 возвращает элементы Персона p1 и p2 с одинаковыми формами; то есть оба элемента Персона имеют идентичную геометрию местоположения.
- Запрос MATCH (e:Employee), (f:Facility) WHERE esri.graph.ST_Intersects(e.shape, f.shape) RETURN e, f возвращает сущности Сотрудник и Здание, e и f, соответственно, где геометрии для элементов Сотрудник и Здание пересекаются.
- Запрос MATCH (f:Facility) WHERE esri.graph.ST_Contains(esri.graph.ST_WKTToGeometry("POINT (-117.1964763 34.0572046)"), f.shape) RETURN f возвращает объекты Здание, 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 из документа, предоставленного openCypher Implementers Group. ArcGIS Knowledge не поддерживает все аспекты языка запросов openCypher. Например, запросы нельзя использовать для обновления графа знаний, только для возврата значений.
В ArcGIS Pro вы можете изучить openCypher, просмотрев запросы, получающие данные графов знаний для построения гистограмм. На панели Поиск и фильтр, на вкладке Гистограмма , щелкните кнопку Настройки и нажмите Отправить запрос на вкладку Запрос. Запрос, используемый для получения данных для текущего набора гистограмм, отображается в текстовом поле Запрос.