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, между которыми любой тип отношений и которые соединяет любой путь. Если бы запрос был написан со стрелкой, указывающей другое направление, пути считались бы начинающимися от элемента-источника 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, доступны несколько опций для хранения временных данных в 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')

Чтобы оценить свойство графа знаний с типом данных сдвиг временной метки, используйте функцию datetime() в запросе openCypher. Используйте формат дата-время YYYY-MM-DDThh:mm:ss.sssZ, если указанное значение соответствует всемирному координированному времени (UTC). Используйте формат 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 со значением после 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 Enterprise 11.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() без указания конкретной даты. Затем осуществляется доступ к части годов вычисленной продолжительности и ее оценка для поиска подходящих путей. Таким образом, можно получить доступ ко всем частям продолжительности, включая дни, часы, минуты и так далее.

Также можно вычислить продолжительность между событиями, которые происходят между связанными частями. Например, следующий запрос оценивает граф знаний, чтобы определить взаимосвязь между элементами Phone и отношениями Called, а также количество времени между телефонными звонками: MATCH (:Phone)-[c1:Called]-(:Phone)-[c2:Called]-(:Phone) WHERE duration.between(c1.datecalled, c2.datecalled).minutes < 45 RETURN c1, c2. В этом запросе вычисляется продолжительность между временем, когда телефон принимает один звонок, и временем, когда выполняется второй звонок. Осуществляется доступ к свойству продолжительности минут, и если между звонками прошло менее сорока пяти минут, запрос возвращает как первый, так и второй телефонные звонки.

Использование записей о происхождении в запросе

Когда вы создаете граф знаний, используя размещенное хранилище графов или хранилище данных 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, просмотрев запросы, получающие данные графов знаний для построения гистограмм. На панели Поиск и фильтр, на вкладке Гистограмма Гистограмма, щелкните кнопку Настройки Настройки и нажмите Отправить запрос на вкладку Запрос. Запрос, используемый для получения данных для текущего набора гистограмм, отображается в текстовом поле Запрос.