использование контекстов для нескольких наборов данных в репозитории graphdb

Я работаю над исследовательским проектом, в котором изучаю успешность процедур восстановления зубов (например, пломбирования). Мы собираем данные из ряда стоматологических клиник, и мы собираемся агрегировать все данные в хранилище троек GraphDB. Мой вопрос связан с тем, как использовать контексты GraphDB, чтобы хранить все данные в одном репо, но при этом иметь возможность запрашивать каждую практику индивидуально, когда это необходимо. Я использую бесплатную версию GraphDB версии 7.0.3 и рабочую среду GraphDB.

Когда я импортирую данные в репо, это дает мне возможность указать контекст. Насколько я понимаю, это, по сути, подграф всего графа RDF. Верно? Но я немного не уверен, чем он отличается от базового URI. На странице примера базовый URI и контекст одинаковы.

Моя общая мысль о том, как настроить репо, - это дать ему базовый URI и сохранить базовый URI одинаковым для каждого набора данных практики, но изменить контекст при загрузке каждой практики. Например:

  • Чтобы загрузить данные практики 1:
    базовый URI: www.example.com/dental-practices/
    context: www.example.com/dental-practices/practice-1

  • Чтобы загрузить данные практики 2:
    базовый URI: www.example.com/dental-practices/
    context: www.example.com/dental-practices/practice-2

  • Чтобы загрузить данные практики 3:
    базовый URI: www.example.com/dental-practices/
    context: www.example.com/dental-practices/practice-3

... и так далее ...

Чтобы запросить совокупность всех данных (я полагаю), я бы использовал запрос SPARQL, который не указывает график. Например, чтобы найти всех пациентов:

select ?patient where { ?patient rdf:type :Patient }

Но как мне задать вопрос о конкретной практике? Могу ли я указать график или использовать клавиши «от». Например:

select ?patient from <practice-1> where { ?patient rdf:type :Patient }

or

select ?patient where { graph <practice-1> { ?patient rdf:type :Patient } }

Наконец, кто-нибудь знает, где есть страница / документация, объясняющая, как эффективно использовать контекст?


person Bill    schedule 22.12.2016    source источник


Ответы (2)


Вы можете использовать любой подход для запроса определенных графиков. И ключевое слово GRAPH, и ключевое слово FROM в этом случае делают примерно одно и то же. Однако использование FROM-варианта возможно быстрее, так как этот вариант немного проще оптимизировать для планировщика запросов.

Немного предыстории: в SPARQL предложение FROMFROM NAMED) указывает набор данных, по которому выполняется запрос, а ключевое слово GRAPH просто «увеличивает» подмножество текущего запрашиваемого набора данных. Если предложение FROM не указано, запрос оценивается по набору данных по умолчанию для базы данных. В GraphDB набор данных SPARQL по умолчанию включает все именованные графы, доступные в базе данных - вот почему в этом случае использование ключевого слова GRAPH и ключевого слова FROM делают то же самое. Обратите внимание, что это зависит от хранилища: другие базы данных могут и действительно выбирают определение набора данных по умолчанию по-другому.

Кстати: ничто из этого не имеет ничего отношения к базовому URI. Базовый URI - это просто синтаксический механизм, используемый при разрешении относительных ссылок URI во входных данных. Базы данных RDF, такие как GraphDB, на самом деле не хранят относительные URI, поэтому базовый URI используется анализатором для преобразования любых относительных URI в ваших данных в абсолютные перед добавлением их в базу данных.

Для дальнейшего чтения я бы порекомендовал собственную документацию GraphDB о поведении запросов. . Также есть раздел об именованных графах в документации по программированию RDF4J - GraphDB тесно связан с API RDF4J, поэтому он следует большинству своих соглашений.

person Jeen Broekstra    schedule 02.01.2017
comment
Спасибо, ваш ответ был очень полезным! - person Bill; 03.01.2017
comment
Я добавил в репо ряд контекстов. Однако я не могу получить результаты. Например, если вы хотите получить количество выполненных реставраций зубов, это работает: PREFIX rdf: ‹w3.org/1999/02/22-rdf-syntax-ns# ›PREFIX rdfs: ‹w3.org/2000/01/rdf-schema#› выберите отдельный (считать (? i) как? total_procedures) где {? i rdf: type ‹purl.obolibrary.org/obo/OHD_0000004 ›. # процедуры восстановления? i rdfs: label? s. } - ›696 Но, если указать контекст, я не получаю никаких результатов: - person Bill; 26.01.2017
comment
@Bill, если у вас есть новый вопрос, опубликуйте его как новый вопрос, а не как комментарий. Добавьте ссылку на этот вопрос, если это помогает обеспечить контекст. - person Jeen Broekstra; 26.01.2017
comment
Билл, не забудьте включить индексы контекста, так как вы запрашиваете по контексту - person Vladimir Alexiev; 20.06.2019

В дополнение к ответу Джина я бы добавил, что базовый URL-адрес является пространством имен по умолчанию для репозитория. По умолчанию значение пусто, но рекомендуется использовать непустые базовые URL-адреса, поскольку это гарантирует уникальность анонимных (пустых) узлов, если они появляются.

person Venelin    schedule 03.01.2017
comment
Вы можете остановиться на этом? Я не знал, что базовые URL-адреса имеют какое-либо отношение к пустым идентификаторам узлов ... - person Jeen Broekstra; 07.01.2017