RML 中是否有针对输入的一个数据元素(单元格)中的多个复杂实体的解决方案,而无需清理输入数据?



我有一个人名列表,例如,这个除了(Person是列名(:

Person
"Wilson, Charles; Harris Arthur"
"White, D.
Arthur Harris"

请注意,多个人以不同的方式提及,并且以不同的方式分开。

我想使用 RDF 映射语言 https://rml.io/创建以下 RDF,而无需清理(或更改(输入数据

:Wilson a foaf:Person;
foaf:firstName "Charles";
foaf:lastName "Wilson" .
:Harris a foaf:Person;
foaf:firstName "Arthur";
foaf:lastName "Harris" .
:White a foaf:Person;
foaf:firstName "D.";
foaf:lastName "White" .

请注意,在输入数据中提到了 Arthur Harris 两次,但只创建了一个 RDF 资源。

我使用函数本体 https://fno.io/并创建了一个自定义的java方法。根据参数mode返回人员属性列表(例如,仅返回 URI 或仅返回名字(。

public static List<String> getPersons(String value, String mode) {
if(mode == null || value.trim().isEmpty())
return Arrays.asList();
List<String> results = new ArrayList<>();
for(Person p : getAllPersons(value)) {
if(mode.trim().isEmpty() || mode.equals("URI")) {
results.add("http://example.org/person/" + p.getLastName());
} else if(mode.equals("firstName")) {
results.add(p.getFirstName());
} else if(mode.equals("lastName")) {
results.add(p.getLastName());
} else if(mode.equals("fullName")) {
results.add(p.getFullName());
}
}
return results;
}

假设getAllPersons方法正确地从给定字符串中提取人员,如上面的字符串所示。 为了从一个单元格中提取多个人,我在这样的subjectMap中调用getPersons函数:

:tripleMap a rr:TriplesMap .
:tripleMap rml:logicalSource :ExampleSource .
:tripleMap rr:subjectMap [
fnml:functionValue [
rr:predicateObjectMap [
rr:predicate fno:executes ;
rr:objectMap [ rr:constant cf:getPersons ]
] ;
rr:predicateObjectMap [
rr:predicate grel:valueParameter ;
rr:objectMap [ rml:reference "Person" ] # the column name
] ;
rr:predicateObjectMap [
rr:predicate grel:valueParameter2 ;
rr:objectMap [ rr:constant "URI" ] # the mode
]
];
rr:termType rr:IRI ;
rr:class foaf:Person
] .

我使用 RMLMapper https://github.com/RMLio/rmlmapper-java,但是,它只允许为每行返回一个主题,请参阅 https://github.com/RMLio/rmlmapper-java/blob/master/src/main/java/be/ugent/rml/Executor.java#L292 。 这就是为什么我写了一个List<ProvenancedTerm> getSubjects(Term triplesMap, Mapping mapping, Record record, int i)方法并相应地替换它。 这将导致以下结果:

:Wilson a foaf:Person .
:Harris a foaf:Person .
:White a foaf:Person .

我知道此扩展与 RML 规范不兼容,https://rml.io/specs/rml/其中陈述了以下内容:

它 [三元组映射] 必须只有一个主题映射,该主题映射指定如何为逻辑源(相应地是数据库/CSV/XML/JSON 数据源(的每个行/记录/元素/对象生成主题

如果我继续添加名字或姓氏,则可以添加以下predicateObjectMap

:tripleMap rr:predicateObjectMap [
rr:predicate foaf:firstName;
rr:objectMap [
fnml:functionValue [
rr:predicateObjectMap [
rr:predicate fno:executes ;
rr:objectMap [ rr:constant cf:getPersons ]
] ;
rr:predicateObjectMap [
rr:predicate grel:valueParameter ;
rr:objectMap [ rml:reference "Person" ] # the column name
] ;
rr:predicateObjectMap [
rr:predicate grel:valueParameter2 ;
rr:objectMap [ rr:constant "firstName" ] # the mode
]
]
]
] .

由于为每个主题评估一个predicateObjectMap,并且现在返回多个主题,因此每个人资源都将获得每个人的名字。为了更清楚,它看起来像这样:

:Wilson a foaf:Person;
foaf:firstName "Charles" ;
foaf:firstName "Arthur" ;
foaf:firstName "D." .
:Harris a foaf:Person;
foaf:firstName "Charles" ;
foaf:firstName "Arthur" ;
foaf:firstName "D." .
:White a foaf:Person;
foaf:firstName "Charles" ;
foaf:firstName "Arthur" ;
foaf:firstName "D." .

我的问题是:在不清理(或更改(输入数据的情况下,RML中是否有针对输入的一个数据元素(单元格(中的多个复杂实体(例如具有名字和姓氏的人(的解决方案或解决方法?

也许这个问题与我的问题有关:https://www.w3.org/community/kg-construct/track/issues/3

如果这样的用例不是由像 RML 这样的映射框架来解决的,那也很好。如果是这样的话,还有什么替代方案呢?例如,生成 RDF 的手工提取管道?

据我所知,使用 FnO 函数和连接条件无法尝试执行的操作。

但是,您可以尝试指定一个巧妙的rml:queryrml:iterator,在复杂值到达 RMLMapper 之前对其进行拆分。但是,这是否可行取决于特定的源数据库。

例如,如果源是 SQL Server 数据库,则可以使用函数 STRING_SPLIT。或者,如果它是一个PostgreSQL数据库,你可以STRING_TO_ARRAY和unnest一起使用。(由于数据中使用了不同的分隔符,因此可能必须为每个不同的分隔符调用STRING_SPLIT或STRING_TO_ARRAY一次。

如果您提供有关基础数据库的更多信息,我可以用示例更新此答案

(注意:我为RML及其技术做出了贡献。

据我了解,您有一个规范化问题(多值单元格(。当然,您要求的是在 1NF 中拥有一个数据集,请参阅:https://en.wikipedia.org/wiki/First_normal_form

要解决 CSV 文件中的这些常见异构性问题,您可以在 Web 注释上使用 CSV(W3C 建议(。更详细地说,在这种情况下,您要求的属性是csvw:separator(https://www.w3.org/TR/tabular-data-primer/#sequence-values(。

但是,CSVW的解析器并不多,并且生成RDF的属性的语义不是很清楚。我们一直在研究一种解决方案,该解决方案与CSVW和RML + FnO一起使用,从表格数据生成虚拟KG(还将SPARQL查询作为输入,而不是将输入数据集转换为RDF(。我们提案的输出是一个格式良好的数据库,具有标准的 [R2]RML 映射,因此任何符合 [R2] RML 的数据库都可用于回答查询或实现知识图谱。虽然我们目前不支持具体化步骤,但它在我们的待办事项列表中。

你可以看看贡献(目前正在审查中(:http://www.semantic-web-journal.net/content/enhancing-virtual-ontology-based-access-over-tabular-data-morph-csv

网站: https://morph.oeg.fi.upm.es/tool/morph-csv

最新更新