从 RDF 中的谓词中获取不同的谓词和提取前缀
Get distinct Predicates and Extract prefix from Predicates in RDF
我有一个 .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 ."
+ "}";
但这并不有效,因为可能还有一些其他属性。如何从没有前缀的模型中获取所有谓词并使用这些谓词获取对象值?
你的谓词 URI 都包含单词 "ontology"... 你真的有一个 ontology 吗? 你明白 ontology 与任何自由形式的链接数据三元组不同? class <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" .
我希望至少看到以下最小值 ontology:
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" .
如果您将数据和 ontology 都加载到像 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
}
Returns这个结果:
+-----------------------------------------------------+------+--------+
| 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 内容的方法之一,您可以使用相同的查询,但您必须使用不同的方法来组合数据三元组和来自 ontology.
@AKSW 的评论是为此特定任务执行子字符串删除的一种方法。具体来说,我们正在从每个 URI 中删除默认 :
前缀的内容。更通用的函数是 replace()
.
我从未见过@AKSW 给出过糟糕的建议,但我强烈建议您养成正确使用 ontology 的习惯,而不是字符串操作解决方法。
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
ment: REPLACE(STR(?x), "^(.*)(/|#)([^#/]*)$", "")
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)
}
一个有趣的练习是像您提供的那样获取或合成数千个三元组,并对这三种不同标记方法的性能进行计时。
此外,使用 ontology,您可以为数据类型属性设置域和范围,例如 population
。在我看来,这应该采用 xsd:integer
,而不是无类型字符串。
我有一个 .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 ."
+ "}";
但这并不有效,因为可能还有一些其他属性。如何从没有前缀的模型中获取所有谓词并使用这些谓词获取对象值?
你的谓词 URI 都包含单词 "ontology"... 你真的有一个 ontology 吗? 你明白 ontology 与任何自由形式的链接数据三元组不同? class <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" .
我希望至少看到以下最小值 ontology:
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" .
如果您将数据和 ontology 都加载到像 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
}
Returns这个结果:
+-----------------------------------------------------+------+--------+
| 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 内容的方法之一,您可以使用相同的查询,但您必须使用不同的方法来组合数据三元组和来自 ontology.
@AKSW 的评论是为此特定任务执行子字符串删除的一种方法。具体来说,我们正在从每个 URI 中删除默认 :
前缀的内容。更通用的函数是 replace()
.
我从未见过@AKSW 给出过糟糕的建议,但我强烈建议您养成正确使用 ontology 的习惯,而不是字符串操作解决方法。
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
ment: REPLACE(STR(?x), "^(.*)(/|#)([^#/]*)$", "")
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)
}
一个有趣的练习是像您提供的那样获取或合成数千个三元组,并对这三种不同标记方法的性能进行计时。
此外,使用 ontology,您可以为数据类型属性设置域和范围,例如 population
。在我看来,这应该采用 xsd:integer
,而不是无类型字符串。