我有一个.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 ."
+ "}";但这是没有效率的,因为可能有其他一些属性。如何在没有前缀的情况下从模型中获取所有谓词,并使用这些谓词来获取对象值?
发布于 2017-07-01 17:54:05
谓词URI都包含“本体论”一词.,你真的有本体论吗?,你明白本体不同于任何自由形式的链接数据三元组吗?定义的类<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()是一个方便的函数,所以您不必键入正则表达式replacement: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,而不是一个非类型字符串。
https://stackoverflow.com/questions/44854630
复制相似问题