gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:02:41 26 4
gpt4 key购买 nike

我有一个人名列表,例如,除了(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方法正确地从给定的字符串中提取人,就像上面的那些。
为了从一个单元格中提取多个人,我调用 getPersons subjectMap 中的函数像这样:
: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
] .

我使用 RLMMapper 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/声明如下:

It [a triples map] must have exactly one subject map that specifies how to generate a subject for each row/record/element/object of the logical source (database/CSV/XML/JSON data source accordingly).



如果我继续添加名字 resp。姓氏,以下 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它在复数值到达 RLMMapper 之前将其拆分。不过,这是否可能取决于特定的源数据库。

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

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

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

关于mapping - RML 中是否有针对输入的一个数据元素(单元格)中的多个复杂实体的解决方案,而无需清理输入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61751174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com