使用SPIN API(http://topbraid.org/spin/api/)并从https://github.com/spinrdf/spinrdf/blob/master/src-examples/org/topbraid/spin/examples/SPINParsingExample.java的示例代码开始工作,我试图在示例中添加对rdfs:注释和旋转:文本的处理。Topbraid Composer免费版(TBC FE)允许每个包含在RDF中的SPIN规则有一个注释。TBC FE还可以选择通过sp: text属性将SPIN SPARQL源代码作为xsd: string值。我想在这个例子的扩展验证中做同样的事情,然后把它转移到我的工作代码中,在那里我想嵌入SPIN规则编辑。
下面是我当前的示例代码扩展版本。请忽略日志记录警告。请注意,我在示例查询顶部插入的注释(第54行)会自动删除到输出中(输出也包括在下面)。
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*/
package mil.disa.dso.spo.a2i.nsc.sharing2025.raaDemo;
import org.topbraid.spin.arq.ARQ2SPIN;
import org.topbraid.spin.arq.ARQFactory;
import org.topbraid.spin.model.Select;
import org.topbraid.spin.system.SPINModuleRegistry;
import org.apache.jena.query.Query;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.util.FileUtils;
import org.apache.jena.vocabulary.RDF;
/**
* Converts between textual SPARQL representation and SPIN RDF model.
*
* @author Holger Knublauch
*/
public class SPINParsingExample {
/**
* @param args
*/
public static void main(String[] args) {
// Register system functions (such as sp:gt (>))
SPINModuleRegistry.get().init();
// Create an empty OntModel importing SP
Model model = ModelFactory.createDefaultModel();
model.setNsPrefix("rdf", RDF.getURI());
model.setNsPrefix("ex", "http://example.org/demo#");
String query =
"# This is an example SPARQL comment\n" +
"SELECT ?person\n" +
"WHERE {\n" +
" ?person a ex:Person .\n" +
" ?person ex:age ?age .\n" +
" FILTER (?age > 18) .\n" +
"}";
System.out.println("Original SPARQL query string:\n\n" + query);
Query arqQuery = ARQFactory.get().createQuery(model, query);
ARQ2SPIN arq2SPIN = new ARQ2SPIN(model);
Select spinQuery = (Select) arq2SPIN.createQuery(arqQuery, null);
// TODO what about the sp:text? It's not in the artifacts printed below...
// TODO figure out how to add a comment to the tokenized query... does not propagate from source string above
// perhaps this is through and addProperty call to add an rdfs:comment?? many calls, not clear how to use...
// get javadoc?
System.out.println("\n-----");
System.out.println("SPIN query in Turtle:\n");
model.write(System.out, FileUtils.langTurtle);
System.out.println("\n-----");
System.out.println("SPIN query in XML:\n");
model.write(System.out, FileUtils.langXML);
System.out.println("\n-----");
String str = spinQuery.toString();
System.out.println("SPIN query:\n\n" + str);
// Now turn it back into a Jena Query
Query parsedBack = ARQFactory.get().createQuery(spinQuery);
System.out.println("Jena query:\n" + parsedBack);
}
}
从上面的输出。。。
log4j:WARN No appenders could be found for logger (Jena).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Original SPARQL query string:
# This is an example SPARQL comment
SELECT ?person
WHERE {
?person a ex:Person .
?person ex:age ?age .
FILTER (?age > 18) .
}
-----
SPIN query in Turtle:
@prefix ex: <http://example.org/demo#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix sp: <http://spinrdf.org/sp#> .
[ a sp:Select ;
sp:resultVariables ( [ sp:varName "person" ]
) ;
sp:where ( [ sp:object ex:Person ;
sp:predicate rdf:type ;
sp:subject [ sp:varName "person" ]
]
[ sp:object [ sp:varName "age" ] ;
sp:predicate ex:age ;
sp:subject [ sp:varName "person" ]
]
[ a sp:Filter ;
sp:expression [ a sp:gt ;
sp:arg1 [ sp:varName "age" ] ;
sp:arg2 18
]
]
)
] .
-----
SPIN query in XML:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:ex="http://example.org/demo#"
xmlns:sp="http://spinrdf.org/sp#">
<sp:Select>
<sp:resultVariables rdf:parseType="Collection">
<rdf:Description>
<sp:varName>person</sp:varName>
</rdf:Description>
</sp:resultVariables>
<sp:where rdf:parseType="Collection">
<rdf:Description>
<sp:object rdf:resource="http://example.org/demo#Person"/>
<sp:predicate rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#type"/>
<sp:subject rdf:parseType="Resource">
<sp:varName>person</sp:varName>
</sp:subject>
</rdf:Description>
<rdf:Description>
<sp:object rdf:parseType="Resource">
<sp:varName>age</sp:varName>
</sp:object>
<sp:predicate rdf:resource="http://example.org/demo#age"/>
<sp:subject rdf:parseType="Resource">
<sp:varName>person</sp:varName>
</sp:subject>
</rdf:Description>
<sp:Filter>
<sp:expression>
<sp:gt>
<sp:arg2 rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>18</sp:arg2>
<sp:arg1 rdf:parseType="Resource">
<sp:varName>age</sp:varName>
</sp:arg1>
</sp:gt>
</sp:expression>
</sp:Filter>
</sp:where>
</sp:Select>
</rdf:RDF>
-----
SPIN query:
SELECT ?person
WHERE {
?person a ex:Person .
?person ex:age ?age .
FILTER (?age > 18) .
}
Jena query:
SELECT ?person
WHERE
{ ?person a <http://example.org/demo#Person> ;
<http://example.org/demo#age> ?age
FILTER ( ?age > 18 )
}
我确信有一种方法可以将rdfs:注释和源代码(通过sp: text)添加到RDF中,但是我还没有找到它。我怀疑可以通过在示例(第66行)中通过spinQuery实例化调用Select类的方法来实现这两者,但我不确定如何实现。任何建议都将不胜感激。
这个问题与我之前回答的问题有关如何将SPARQL/SPIN查询/规则从Java变成RDF结构?但是专门研究RDF中的注释和源代码。
似乎您可以将rdfs:注释
仅添加到冗长的rdf形式的查询中。不可能将rdfs:评论
传递到sp: text
,因为最后一个是字符串的谓词,您只能将其作为字符串的一部分。Topbraid似乎只允许通过RDF图进行注释,文本查询只存在于图形用户界面中(作为分离的模型)。一个建议:保持你的查询RDF形式,在这种情况下,你也不会有前缀可能的问题。
示例如何添加rdfs:comment
和sp:text
:
public static void main(String ... args) {
Model model = ModelFactory.createDefaultModel();
model.setNsPrefix("rdf", RDF.getURI());
model.setNsPrefix("ex", "http://example.org/demo#");
model.setNsPrefix("sp", SP.getURI());
model.setNsPrefix("rdfs", RDFS.getURI());
String query = "SELECT ?person\n" +
"WHERE {\n" +
" ?person a ex:Person .\n" +
" ?person ex:age ?age .\n" +
" FILTER (?age > 18) .\n" +
"}";
Query arqQuery = ARQFactory.get().createQuery(model, query);
ARQ2SPIN arq2SPIN = new ARQ2SPIN(model);
Select select1 = (Select) arq2SPIN.createQuery(arqQuery, null);
select1.addProperty(RDFS.comment, "Comment1"); // <-- as part of rdf
Resource anon = model.createResource();
anon.addProperty(RDF.type, SP.Select);
anon.addProperty(SP.text, model.createTypedLiteral(
"# Comment2\n" + // <-- as part of string
"SELECT ?person\n" +
"WHERE {\n" +
" ?person a ex:Person .\n" +
" ?person ex:age ?age .\n" +
" FILTER (?age < 22) .\n" +
"}"));
Select select2 = anon.as(Select.class);
System.out.println("========================");
model.write(System.out, "ttl");
System.out.println("========================");
System.out.println("Select1:\n" + select1);
System.out.println("Select2:\n" + select2);
}
和输出:
========================
@prefix ex: <http://example.org/demo#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sp: <http://spinrdf.org/sp#> .
_:b0 a sp:Filter ;
sp:expression [ a sp:gt ;
sp:arg1 [ sp:varName "age" ] ;
sp:arg2 18
] .
_:b1 sp:object [ sp:varName "age" ] ;
sp:predicate ex:age ;
sp:subject [ sp:varName "person" ] .
[ a sp:Select ;
rdfs:comment "Comment1" ;
sp:resultVariables ( _:b2 ) ;
sp:where ( _:b3 _:b1 _:b0 )
] .
_:b3 sp:object ex:Person ;
sp:predicate rdf:type ;
sp:subject [ sp:varName "person" ] .
_:b2 sp:varName "person" .
[ a sp:Select ;
sp:text "# Comment2\nSELECT ?person\nWHERE {\n ?person a ex:Person .\n ?person ex:age ?age .\n FILTER (?age < 22) .\n}"
] .
========================
Select1:
# Comment1
SELECT ?person
WHERE {
?person a ex:Person .
?person ex:age ?age .
FILTER sp:gt(?age, 18) .
}
Select2:
# Comment2
SELECT ?person
WHERE {
?person a ex:Person .
?person ex:age ?age .
FILTER (?age < 22) .
}
我一直在使用TopQuadran Composer Free Edition(TBC FE)将SPARQL/SPIN规则(主要是SPIN构造函数)嵌入到存储为RDF的OWL本体中。这个过程的一部分是SPARQL源代码根据http://spinrdf.org/sp.中指定的模式http://spinrdf.org/sp.html在RDF结构中标记/编码。正是这个结构实际上被RDF4J解释来运行SPI
在自然语言处理的实际项目中,通常要使用大量的语言数据或者语料库。本章的目的是要回答下列问题: 什么是有用的文本语料和词汇资源,我们如何使用Python 获取它们? 哪些Python 结构最适合这项工作? 编写Python 代码时我们如何避免重复的工作? 本章继续通过语言处理任务的例子展示编程概念。在系统的探索每一个Python 结构之前请耐心等待。如果你看到一个例子中含有一些不熟悉的东西,请不要担
我有一个列是使用在hibernate中映射的。如何使用本机Oracle SQL根据Oracle存储和检索这些值? 该列映射为。我尝试使用我为Unix时间戳找到的一些公式,但它们似乎没有产生正确的结果。 我想用使用Hibernate Envers。我遇到了麻烦,因为我正在将Envers应用到没有审计历史记录的现有记录的数据库中。我要做的是一次性插入审计数据,使用Oracle作为时间戳。
[][1]我正在尝试用Vala语言做一个类似siri的应用程序。然而,我找不到任何语音识别或文本到语音库的vala,这是必不可少的。瓦拉有语音识别和语音文字转换吗?如果是的话,你能说出他们的名字吗? 顺便说一句,我是新的vala编程,所以也请做一些例子... 非常感谢。
本文向大家介绍如何实现数组和 List 之间的转换?相关面试题,主要包含被问及如何实现数组和 List 之间的转换?时的应答技巧和注意事项,需要的朋友参考一下 数组转 List:使用 Arrays. asList(array) 进行转换。 List 转数组:使用 List 自带的 toArray() 方法。 代码示例:
主要内容:类型断言的格式,将接口转换为其他接口,将接口转换为其他类型Go语言中使用接口断言(type assertions)将接口转换成另外一个接口,也可以将接口转换为另外的类型。接口的转换在开发中非常常见,使用也非常频繁。 类型断言的格式 类型断言是一个使用在接口值上的操作。语法上它看起来像 i.(T) 被称为断言类型,这里 i 表示一个接口的类型和 T 表示一个类型。一个类型断言检查它操作对象的动态类型是否和断言的类型匹配。 类型断言的基本格式如下: 其中,i