我有一个.ttl
文件。我想从中提取所有不同的谓词。我正在使用Apache-jena
。为此,我使用了 SPARQL 命令:
"SELECT DISTINCT ?property WHERE {" +
" ?s ?property ?o ."
+ "}";
我得到的结果是这样的:
<http://something.dk/ontology/business/name
<http://something.dk/ontology/business/id
我想要的是摆脱这个前缀,
<http://something.dk/ontology/business/
并仅获取name
和id
作为谓词,这些谓词将用于相应地获取其对象值。现在,我这样做:
"prefix j.0`<http://something.dk/ontology/business/>" +
"select ?a ?b where {" +
" ?Name j.0:name ?a ."
+ " ?Name j.0:id ?b ."
+ "}";
但由于可能存在其他一些属性,因此效率不高。如何在没有前缀的情况下从模型中获取所有谓词,并使用这些谓词来获取对象值?
答案 0 :(得分:2)
你的谓词URI都包含单词&#34;本体&#34; ... 你真的有本体吗?你是否理解本体不同于任何自由形式的链接数据三倍?类<http://something.dk/ontology/business/village>
和谓词<http://something.dk/ontology/business/population>
定义在哪里?
换句话说,对于这些数据三元组:
prefix : <http://something.dk/ontology/business/>
<http://something.dk/resource/business/community/326> :name "Akalia" ;
a :village ;
:id "326" ;
:population "2000" ;
:area "30" .
我希望至少看到以下最小的本体论:
prefix : <http://something.dk/ontology/business/> .
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#> .
:madman.owl rdf:type owl:Ontology .
:area rdf:type owl:DatatypeProperty ;
rdfs:label "area" .
:id rdf:type owl:DatatypeProperty ;
rdfs:label "id" .
:name rdf:type owl:DatatypeProperty ;
rdfs:label "name" .
:area rdf:type owl:DatatypeProperty ;
rdfs:label "area" .
:village rdf:type owl:Class ;
rdfs:label "village" .
如果您将数据和本体加载到像Jena Fuseki这样的三元组中,则此查询:
PREFIX : <http://something.dk/ontology/business/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?v ?l ?o
WHERE
{ ?v a :village ;
?p ?o .
?p rdfs:label ?l
}
返回此结果:
+-----------------------------------------------------+------+--------+
| v | l | o |
+-----------------------------------------------------+------+--------+
| http://something.dk/resource/business/community/326 | id | 326 |
| http://something.dk/resource/business/community/326 | area | 30 |
| http://something.dk/resource/business/community/326 | name | Akalia |
+-----------------------------------------------------+------+--------+
如果您使用Jena的其他方式访问RDF内容,您可以使用相同的查询,但您必须使用不同的方法来组合数据三元组和三元组本体。
@ AKSW的评论是为此特定任务执行子字符串删除的一种方法。具体来说,我们将从每个URI中删除默认:
前缀的内容。更通用的功能是replace()
。
我从未见过@AKSW给出错误的建议,但我真的会敦促你养成使用正确本体的习惯,而不是字符串操作解决方法。
PREFIX : <http://something.dk/ontology/business/>
SELECT ?v ?extrLabel ?o
WHERE
{ ?v a :village ;
?p ?o
BIND(strafter(str(?p), str(:)) AS ?extrLabel)
}
@Stanislav也知道他的东西。我认为afn:localname()
是一项便利功能,因此您不必输入此正则表达式replace
:REPLACE(STR(?x), "^(.*)(/|#)([^#/]*)$", "$3")
PREFIX : <http://something.dk/ontology/business/>
PREFIX afn: <http://jena.apache.org/ARQ/function#>
SELECT ?v ?extrLabel ?o
WHERE
{ ?v a :village ;
?p ?o
BIND(afn:localname(?p) AS ?extrLabel)
}
有趣的练习是获取或合成数千个像你提供的三元组,并计算这三种不同标记方法的表现。
此外,使用本体,您可以设置数据类型属性的域和范围,例如population
。在我看来,这应该是一个xsd:integer
,而不是一个无类型的字符串。