Преобразование RDB в RDF с автогенерированным кодом

Я использую программное обеспечение OpenLink Virtuoso для преобразования реляционной базы данных в RDF с помощью этого руководства: Автоматическое создание связанных представлений данных из реляционных источников данных с помощью Virtuoso

У меня есть база данных с 5 таблицами (Authors, Keywords, Publications, References, Rights), и я импортировал их в базу данных Virtuoso, используя файлы .csv.

Итак, в основном я выполнил шаги для "Создание и развертывание связанных данных вручную с помощью мастера Conductor на основе HTML", потому что мне нужно использовать свои собственные онтологии, и это код, созданный для графика R2RML:

@prefix rr: <http://www.w3.org/ns/r2rml#> .
@prefix CSV: <http://localhost:8890/schemas/CSV/> .
@prefix csv-stat: <http://localhost:8890/CSV/stat#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix void: <http://rdfs.org/ns/void#> .
@prefix scovo: <http://purl.org/NET/scovo#> .
@prefix aowl: <http://bblfish.net/work/atom-owl/2006-06-06/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix bibo: <http://purl.org/ontology/bibo/> . 


<#TriplesMapAuthors_csv> a rr:TriplesMap; 
rr:logicalTable [ rr:tableSchema "CSV" ;         
rr:tableOwner "DBA" ; rr:tableName "Authors_csv" ]; 
rr:subjectMap [ rr:termtype "IRI"  ; 
rr:template "http://localhost:8890/CSV/authors_csv/ID={ID}"; 
rr:class CSV:Authors_csv; rr:graph <http://localhost:8890/CSV#> ];
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:id ] ; 
rr:objectMap [ rr:column "ID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:authorid ] ; 
rr:objectMap [ rr:column "AuthorID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:authorname ] ; 
rr:objectMap [ rr:column "AuthorName" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:authormidlename ] ; 
rr:objectMap [ rr:column "AuthorMidleName" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:authorsurname ] ; 
rr:objectMap [ rr:column "AuthorSurname" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:authorurl ] ; 
rr:objectMap [ rr:column "AuthorURL" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:authoremail ] ; 
rr:objectMap [ rr:column "AuthorEmail" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:csd_dep ] ; 
rr:objectMap [ rr:column "CSD_DEP" ]; ] .

<#TriplesMapKeywords_csv> a rr:TriplesMap; rr:logicalTable [ rr:tableSchema "CSV" ; rr:tableOwner "DBA" ; rr:tableName "Keywords_csv" ]; 
rr:subjectMap [ rr:termtype "IRI"  ; rr:template "http://localhost:8890/CSV/keywords_csv/ID={ID}"; rr:class CSV:Keywords_csv; rr:graph <http://localhost:8890/CSV#> ];
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:id ] ; rr:objectMap [ rr:column "ID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationid ] ; rr:objectMap [ rr:column "PublicationID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:keyword ] ; rr:objectMap [ rr:column "Keyword" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:keywordorder ] ; rr:objectMap [ rr:column "KeywordOrder" ]; ] .

<#TriplesMapPublications_csv> a rr:TriplesMap; rr:logicalTable [ rr:tableSchema "CSV" ; rr:tableOwner "DBA" ; rr:tableName "Publications_csv" ]; 
rr:subjectMap [ rr:termtype "IRI"  ; rr:template "http://localhost:8890/CSV/publications_csv/ID={ID}"; rr:class CSV:Publications_csv; rr:graph <http://localhost:8890/CSV#> ];
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:id ] ; rr:objectMap [ rr:column "ID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationid ] ; rr:objectMap [ rr:column "PublicationID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationtitle ] ; rr:objectMap [ rr:column "PublicationTitle" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:mediatype ] ; rr:objectMap [ rr:column "MediaType" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationtype ] ; rr:objectMap [ rr:column "PublicationType" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:mediatitle ] ; rr:objectMap [ rr:column "MediaTitle" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:mediapublisher ] ; rr:objectMap [ rr:column "MediaPublisher" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:mediaeditors ] ; rr:objectMap [ rr:column "MediaEditors" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:mediavolinfo ] ; rr:objectMap [ rr:column "MediaVolInfo" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationyear ] ; rr:objectMap [ rr:column "PublicationYear" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationnoofpages ] ; rr:objectMap [ rr:column "PublicationNoOfPages" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationpagesinmedium ] ; rr:objectMap [ rr:column "PublicationPagesInMedium" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationfilename ] ; rr:objectMap [ rr:column "PublicationFileName" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationcomments ] ; rr:objectMap [ rr:column "PublicationComments" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationrelatedurl ] ; rr:objectMap [ rr:column "PublicationRelatedURL" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationrelatedurltext ] ; rr:objectMap [ rr:column "PublicationRelatedURLText" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationlocation ] ; rr:objectMap [ rr:column "PublicationLocation" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationpuburl ] ; rr:objectMap [ rr:column "PublicationPubURL" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:displayonmlkd ] ; rr:objectMap [ rr:column "DisplayOnMLKD" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:displayoniskp ] ; rr:objectMap [ rr:column "DisplayOnISKP" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publishonweb ] ; rr:objectMap [ rr:column "PublishOnWeb" ]; ] .

<#TriplesMapReferences_csv> a rr:TriplesMap; rr:logicalTable [ rr:tableSchema "CSV" ; rr:tableOwner "DBA" ; rr:tableName "References_csv" ]; 
rr:subjectMap [ rr:termtype "IRI"  ; rr:template "http://localhost:8890/CSV/references_csv/ID={ID}"; rr:class CSV:References_csv; rr:graph <http://localhost:8890/CSV#> ];
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:id ] ; rr:objectMap [ rr:column "ID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:refid ] ; rr:objectMap [ rr:column "RefID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:refpaperid ] ; rr:objectMap [ rr:column "RefPaperID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:refdetails ] ; rr:objectMap [ rr:column "RefDetails" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:refyear ] ; rr:objectMap [ rr:column "RefYear" ]; ] .

<#TriplesMapRights_csv> a rr:TriplesMap; rr:logicalTable [ rr:tableSchema "CSV" ; rr:tableOwner "DBA" ; rr:tableName "Rights_csv" ]; 
rr:subjectMap [ rr:termtype "IRI"  ; rr:template "http://localhost:8890/CSV/rights_csv/ID={ID}"; rr:class CSV:Rights_csv; rr:graph <http://localhost:8890/CSV#> ];
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:id ] ; rr:objectMap [ rr:column "ID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:publicationid ] ; rr:objectMap [ rr:column "PublicationID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:authorid ] ; rr:objectMap [ rr:column "AuthorID" ]; ] ;
rr:predicateObjectMap [ rr:predicateMap [ rr:constant CSV:authororder ] ; rr:objectMap [ rr:column "AuthorOrder" ]; ] .

А это автоматически сгенерированный код Ontology:

@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix aowl: <http://bblfish.net/work/atom-owl/2006-06-06/> .
@prefix virtrdf: <http://www.openlinksw.com/schemas/virtrdf#> .
@prefix CSV: <http://localhost:8890/schemas/CSV/> .
@prefix dcterms: <http://purl.org/dc/terms/> . 
@prefix foaf: <http://xmlns.com/foaf/0.1/> . 
@prefix bibo: <http://purl.org/ontology/bibo/> . 

CSV: a owl:Ontology .

# CSV.DBA.Authors_csv
CSV:Authors_csv a rdfs:Class .
CSV:Authors_csv rdfs:isDefinedBy CSV: .
CSV:Authors_csv rdfs:label "CSV.DBA.Authors_csv" .
CSV:Authors_csv rdfs:subClassOf foaf:Person .
CSV:id a owl:DatatypeProperty .
CSV:id rdfs:range xsd:int .
CSV:id rdfs:domain CSV:Authors_csv .
CSV:id rdfs:isDefinedBy CSV: .
CSV:id rdfs:label "ID" .
CSV:authoremail a owl:DatatypeProperty .
CSV:authoremail rdfs:range xsd:string .
CSV:authoremail rdfs:domain CSV:Authors_csv .
CSV:authoremail rdfs:isDefinedBy CSV: .
CSV:authoremail rdfs:label "AuthorEmail" .
CSV:csd_dep a owl:DatatypeProperty .
CSV:csd_dep rdfs:range xsd:int .
CSV:csd_dep rdfs:domain CSV:Authors_csv .
CSV:csd_dep rdfs:isDefinedBy CSV: .
CSV:csd_dep rdfs:label "CSD_DEP" .

# CSV.DBA.Keywords_csv
CSV:Keywords_csv a rdfs:Class .
CSV:Keywords_csv rdfs:isDefinedBy CSV: .
CSV:Keywords_csv rdfs:label "CSV.DBA.Keywords_csv" .
CSV:id a owl:DatatypeProperty .
CSV:id rdfs:range xsd:int .
CSV:id rdfs:domain CSV:Keywords_csv .
CSV:id rdfs:isDefinedBy CSV: .
CSV:id rdfs:label "ID" .
CSV:publicationid a owl:DatatypeProperty .
CSV:publicationid rdfs:range xsd:int .
CSV:publicationid rdfs:domain CSV:Keywords_csv .
CSV:publicationid rdfs:isDefinedBy CSV: .
CSV:publicationid rdfs:label "PublicationID" .
CSV:keyword a owl:DatatypeProperty .
CSV:keyword rdfs:range xsd:string .
CSV:keyword rdfs:domain CSV:Keywords_csv .
CSV:keyword rdfs:isDefinedBy CSV: .
CSV:keyword rdfs:label "Keyword" .
CSV:keywordorder a owl:DatatypeProperty .
CSV:keywordorder rdfs:range xsd:int .
CSV:keywordorder rdfs:domain CSV:Keywords_csv .
CSV:keywordorder rdfs:isDefinedBy CSV: .
CSV:keywordorder rdfs:label "KeywordOrder" .

# CSV.DBA.Publications_csv
CSV:Publications_csv a rdfs:Class .
CSV:Publications_csv rdfs:isDefinedBy CSV: .
CSV:Publications_csv rdfs:label "CSV.DBA.Publications_csv" .
CSV:Publications_csv rdfs:subClassOf bibo:Article .
CSV:publicationtitle a owl:DatatypeProperty .
CSV:publicationtitle rdfs:range xsd:string .
CSV:publicationtitle rdfs:domain CSV:Publications_csv .
CSV:publicationtitle rdfs:isDefinedBy CSV: .
CSV:publicationtitle rdfs:label "PublicationTitle" .
CSV:mediatype a owl:DatatypeProperty .
CSV:mediatype rdfs:range xsd:string .
CSV:mediatype rdfs:domain CSV:Publications_csv .
CSV:mediatype rdfs:isDefinedBy CSV: .
CSV:mediatype rdfs:label "MediaType" .
CSV:publicationtype a owl:DatatypeProperty .
CSV:publicationtype rdfs:range xsd:int .
CSV:publicationtype rdfs:domain CSV:Publications_csv .
CSV:publicationtype rdfs:isDefinedBy CSV: .
CSV:publicationtype rdfs:label "PublicationType" .
CSV:mediatitle a owl:DatatypeProperty .
CSV:mediatitle rdfs:range xsd:string .
CSV:mediatitle rdfs:domain CSV:Publications_csv .
CSV:mediatitle rdfs:isDefinedBy CSV: .
CSV:mediatitle rdfs:label "MediaTitle" .
CSV:publicationyear a owl:DatatypeProperty .
CSV:publicationyear rdfs:range xsd:int .
CSV:publicationyear rdfs:domain CSV:Publications_csv .
CSV:publicationyear rdfs:isDefinedBy CSV: .
CSV:publicationyear rdfs:label "PublicationYear" .
CSV:publicationfilename a owl:DatatypeProperty .
CSV:publicationfilename rdfs:range xsd:string .
CSV:publicationfilename rdfs:domain CSV:Publications_csv .
CSV:publicationfilename rdfs:isDefinedBy CSV: .
CSV:publicationfilename rdfs:label "PublicationFileName" .
CSV:publicationcomments a owl:DatatypeProperty .
CSV:publicationcomments rdfs:range xsd:string .
CSV:publicationcomments rdfs:domain CSV:Publications_csv .
CSV:publicationcomments rdfs:isDefinedBy CSV: .
CSV:publicationcomments rdfs:label "PublicationComments" .
CSV:displayonmlkd a owl:ObjectProperty .
CSV:displayonmlkd rdfs:range aowl:Content .
CSV:displayonmlkd rdfs:domain CSV:Publications_csv .
CSV:displayonmlkd rdfs:isDefinedBy CSV: .
CSV:displayonmlkd rdfs:label "DisplayOnMLKD" .
CSV:displayoniskp a owl:ObjectProperty .
CSV:displayoniskp rdfs:range aowl:Content .
CSV:displayoniskp rdfs:domain CSV:Publications_csv .
CSV:displayoniskp rdfs:isDefinedBy CSV: .
CSV:displayoniskp rdfs:label "DisplayOnISKP" .
CSV:publishonweb a owl:ObjectProperty .
CSV:publishonweb rdfs:range aowl:Content .
CSV:publishonweb rdfs:domain CSV:Publications_csv .
CSV:publishonweb rdfs:isDefinedBy CSV: .
CSV:publishonweb rdfs:label "PublishOnWeb" .

# CSV.DBA.References_csv
CSV:References_csv a rdfs:Class .
CSV:References_csv rdfs:isDefinedBy CSV: .
CSV:References_csv rdfs:label "CSV.DBA.References_csv" .
CSV:References_csv rdfs:subClassOf bibo:ReferenceSource .
CSV:refyear a owl:DatatypeProperty .
CSV:refyear rdfs:range xsd:int .
CSV:refyear rdfs:domain CSV:References_csv .
CSV:refyear rdfs:isDefinedBy CSV: .
CSV:refyear rdfs:label "RefYear" .

# CSV.DBA.Rights_csv
CSV:Rights_csv a rdfs:Class .
CSV:Rights_csv rdfs:isDefinedBy CSV: .
CSV:Rights_csv rdfs:label "CSV.DBA.Rights_csv" .
CSV:Rights_csv rdfs:subClassOf dcterms:RightsStatement .
CSV:id a owl:DatatypeProperty .
CSV:id rdfs:range xsd:int .
CSV:id rdfs:domain CSV:Rights_csv .
CSV:id rdfs:isDefinedBy CSV: .
CSV:id rdfs:label "ID" .
CSV:publicationid a owl:DatatypeProperty .
CSV:publicationid rdfs:range xsd:int .
CSV:publicationid rdfs:domain CSV:Rights_csv .
CSV:publicationid rdfs:isDefinedBy CSV: .
CSV:publicationid rdfs:label "PublicationID" .
CSV:authorid a owl:DatatypeProperty .
CSV:authorid rdfs:range xsd:int .
CSV:authorid rdfs:domain CSV:Rights_csv .
CSV:authorid rdfs:isDefinedBy CSV: .
CSV:authorid rdfs:label "AuthorID" .
CSV:authororder a owl:DatatypeProperty .
CSV:authororder rdfs:range xsd:int .
CSV:authororder rdfs:domain CSV:Rights_csv .
CSV:authororder rdfs:isDefinedBy CSV: .
CSV:authororder rdfs:label "AuthorOrder" .

В конце "преобразования" он представляет статус операций, которые завершились успешно, и дает мне следующие ссылки:

Отношения SQL (таблицы) с операторами RDF (предикат / граф свойств) Сопоставления

http://localhost:8890/schemas/CSV/qm-authors_csv
http://localhost:8890/schemas/CSV/qm-keywords_csv
http://localhost:8890/schemas/CSV/qm-publications_csv
http://localhost:8890/schemas/CSV/qm-references_csv
http://localhost:8890/schemas/CSV/qm-rights_csv
http://localhost:8890/schemas/CSV/qm-VoidStatistics

Образец IRI графика и URI связанных объектов данных

RDFDocument (именованный график) IRI:

Transient Views: http://localhost:8890/CSV#
http://localhost:8890/CSV/authors_csv/ID/1#this
http://localhost:8890/CSV/authors_csv/ID/1#this
http://localhost:8890/CSV/keywords_csv/ID/1#this
http://localhost:8890/CSV/publications_csv/ID/1#this
http://localhost:8890/CSV/publications_csv/ID/1#this
http://localhost:8890/CSV/objects/publications_csv/ID/1/DisplayOnMLKD.bin
http://localhost:8890/CSV/references_csv/ID/1#this
http://localhost:8890/CSV/references_csv/ID/1#this
http://localhost:8890/CSV/rights_csv/ID/1#this
http://localhost:8890/CSV/rights_csv/ID/1#this
Metadata Data Document (VoiD) URI/URL: http://localhost:8890/CSV/stat#
Linked Data Ontology URI: http://localhost:8890/schemas/CSV/

Я попытался использовать следующий запрос, чтобы просмотреть все результаты и проверить их:

SELECT *
FROM <http://localhost:8890/CSV>
WHERE {?s ?o ?p}

Вышеупомянутый запрос не возвращает ничего, всего лишь 3 пустых столбца с заголовками s, o, p.

Вопрос:

Итак, основываясь на приведенных выше результатах, как я могу найти, где хранятся мои графики и какие запросы SPARQL мне следует использовать на моей конечной точке Virtuoso для просмотра моих результатов?


person sokras    schedule 19.06.2014    source источник
comment
Для справки в будущем ... Вопросы, конкретно касающиеся OpenLink Virtuoso, обычно лучше всего поднимать на общедоступные дискуссионные форумы OpenLink, список рассылки Virtuoso Users или через конфиденциальное обращение в службу поддержки.   -  person TallTed    schedule 03.07.2014


Ответы (1)


Вы допустили небольшую опечатку в своем запросе.

Все знаки препинания в URI значимы, в вашем списке имен графиков отображается http://localhost:8890/CSV#, но вы запросили http://localhost:8890/CSV - обратите внимание на отсутствующий знак #.

Вам нужно изменить свой запрос так:

SELECT *
FROM <http://localhost:8890/CSV#>
WHERE {?s ?p ?o}

Обратите внимание, что я также меняю порядок ваших переменных на ?s ?p ?o, а не на ?s ?o ?p, это не имеет значения, потому что имена переменных определяются пользователем, но если вы выбираете все тройки на графике, обычно используется ?s ?p ?o, поскольку имена соответствуют субъекту, предикату и объект троек

person RobV    schedule 19.06.2014
comment
Хорошо, я думаю, что это действительно была моя проблема, но теперь у меня есть следующая ошибка: Virtuoso 42000 Ошибка SR186: Нет разрешения на выполнение dpipe DB.DBA.RL_I2ID с идентификатором пользователя 106, идентификатор группы 106 Запрос SPARQL: определить sql: big-data-const 0 # output-format: text / html SELECT * FROM WHERE {? S? P? O} Мне кажется, что мне нужно предоставить пользователю некоторые привилегии. Но я не знаю, что я новичок в этом: / - person sokras; 19.06.2014
comment
@sokras Это другой вопрос. Stack Overflow - это не только ответы на вопросы, но и ответы на них так, чтобы люди в будущем могли их найти. Пожалуйста, задавайте свой новый вопрос как новый вопрос, потому что люди не найдут ни его, ни ответа, если они спрятаны в комментариях. - person Joshua Taylor; 19.06.2014
comment
Ой, извини, я этого не осознавал. Я создам новый. :) - person sokras; 19.06.2014
comment
@RobV Как я могу просмотреть каждый из графиков, созданных для каждой таблицы? Я имею в виду, что в разделе ОТ, какую ссылку я должен использовать, чтобы просмотреть, например, только график, сделанный для таблицы публикаций? - person sokras; 19.06.2014
comment
@sokras Опять же, это другой вопрос, поэтому задайте его как таковой - person RobV; 19.06.2014
comment
О, хорошо, извини, я здесь новенький: / - person sokras; 19.06.2014