我正在使用Sesame库在内存中的三重存储上运行SPARQL查询.
我正在使用Clojure来实现这一目标.
查询结果是一个类似自定义Iterator的[1]对象,因此clojure seq不能在开箱即用的情况下工作.
将自定义java Iterator类似对象转换为clojure序列的最优雅方法是什么?
我想到的最明显和最愚蠢的想法是循环它并建立一个clojure向量,但我确信有更优雅的方法来解决这个问题.
[1] http://www.openrdf.org/doc/sesame2/api/info/aduna/iteration/Iteration.html
有人试验像芝麻这样的RDF存储解决方案吗?与传统的数据库解决方案相比,我正在寻找这种解决方案的性能评估.
如何在SPARQL 1.1中使用replace函数,尤其是在更新命令中?
例如,如果我有多个三元组?s?p?o其中?o是一个字符串,对于所有三元组,其中包含字符串"gotit"我想插入一个额外的三元组,其中"gotit"被替换为" "我怎么能这样做?我试图实现这是芝麻2.6.0.
我尝试了这种天真的方法:
INSERT { ?s ?p replace(?o,"gotit","haveit","i") . }
WHERE { ?s ?p ?o . FILTER(regex(?o,"gotit","i")) }
Run Code Online (Sandbox Code Playgroud)
但这导致语法错误.
我也无法在查询的结果列表中使用replace,如下所示:
SELECT ?s ?p (replace(?o,"gotit","haveit","i") as ?r) WHERE { .... }
Run Code Online (Sandbox Code Playgroud)
遗憾的是,SPARQL文档不包含如何使用此函数的示例.
是否有可能使用函数来创建新值而不仅仅是测试现有值,如果是,如何?
我正在试验Sesame和Virtuoso Triplestores.在Moment中,我使用Sesame Java API将RDF数据添加到Triplestores.
我的RDF数据代表不同的东西,如Videodata,Userdata等.目前我可以将一个视频的RDF(标题,描述,位置等)添加到Triplestore
但是如何更新商店中的RDF?
例如,如果我使用芝麻的REST接口并使用更新的RDF进行PUT请求,则首先删除存储中的所有内容.
当我使用带有更新数据的POST(例如视频标题已更改)时,将存储标题(旧的和新的).
你如何与三重商店合作?也许我想念一些必要的东西.
编辑:
我现在在每个RDF条目中使用Virtuoso中的Sesame和Graphs中的Context.这种更新方式我可以先清除上下文并再次添加.当我为两个Triplestores使用Sesame API时(我们仍然不知道我们将使用哪一个),代码看起来完全相同.
ValueFactory f = rep.getValueFactory();
URI uri = f.createURI(urn);
con.clear(uri);
con.add(reader,this.baseURI, RDFFormat.RDFXML,uri);
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助
使用葡萄酒本体,我想创建SPARQL查询,以便我可以检索所有的葡萄酒和它们的属性如下面的表格-认为,我不知道属性的名称先验.
vin | rdf:type | vin:hasMaker | vin:hasSugar | ...
========================================================================== ...
GaryFarrellMerlot | vin:Merlot | vin:Elyse | vin:Dry | ...
--------------------------------------------------------------------------
ElyseZinfandel | vin:Elyse | vin:GaryFarrell | vin:Dry | ...
...
Run Code Online (Sandbox Code Playgroud)
有人能给我一个暗示吗?
- 编辑
查询结果不可能是我提到的格式,但我可以这样说:
vin | property | value
=================================================
GaryFarrellMerlot | rdf:type | vin:Merlot
-------------------------------------------------
GaryFarrellMerlot | rdf:hasMaker | vin:Elyse
-------------------------------------------------
...
Run Code Online (Sandbox Code Playgroud)
有了这个选择(谢谢cygri):
SELECT DISTINCT ?wine ?property ?value
WHERE {
?o1 a ?class .
?wine a ?o1 …Run Code Online (Sandbox Code Playgroud) 我有一个java应用程序,它有一些依赖项,其中有另一个项目有自己的依赖项.每当我从Netbeans或mvn exec运行它是好的但是当我尝试打包它,即使它已成功构建,在运行时我得到以下错误:
Exception in thread "main" org.openrdf.rio.UnsupportedRDFormatException: No parser factory available for RDF format Turtle (mimeTypes=text/turtle, application/x-turtle; ext=ttl)
at org.openrdf.rio.Rio.createParser(Rio.java:198)
at org.openrdf.rio.Rio.createParser(Rio.java:213)
at org.openrdf.repository.util.RDFLoader.loadInputStreamOrReader(RDFLoader.java:318)
at org.openrdf.repository.util.RDFLoader.load(RDFLoader.java:222)
at org.openrdf.repository.util.RDFLoader.load(RDFLoader.java:104)
at org.openrdf.repository.base.RepositoryConnectionBase.add(RepositoryConnectionBase.java:217)
at net.antidot.semantic.rdf.model.impl.sesame.SesameDataSet.loadDataFromFile(SesameDataSet.java:160)
Run Code Online (Sandbox Code Playgroud)
所以问题是sesame rio解析器似乎不包括在内,即使我可以在我的maven存储库中看到它们.我在所包含的项目中包含所有依赖项.我也试图排除它们并明确地将它们添加到我的主项目中它再次失败.
有什么建议?
我的依赖树:
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ RMLMapper ---
[INFO] be.ugent.mmlab:RMLMapper:jar:0.1
[INFO] +- junit:junit:jar:4.11:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- xom:xom:jar:1.2.5:compile
[INFO] | +- xml-apis:xml-apis:jar:1.3.03:compile
[INFO] | +- xerces:xercesImpl:jar:2.8.0:compile
[INFO] | \- xalan:xalan:jar:2.7.0:compile
[INFO] +- jlibs:jlibs-xmldog:jar:1.0:compile
[INFO] | +- jlibs:jlibs-xml:jar:1.0:compile
[INFO] | | +- jlibs:jlibs-core:jar:1.0:compile
[INFO] …Run Code Online (Sandbox Code Playgroud) 如何解析并将Notation3文件表示的三元组加载到数据库中?我对Jena和Sesame有点熟悉,但这些似乎适合处理RDF或Turtle,而不是完整的Notation3.
我发现用于处理N3的相对较少的强大工具.这里列出了我发现的少数几个,只包含粗略的Python脚本,它们只能执行基本的命令行操作,似乎没有标准的打包,分发或维护.默认的Python库似乎是,notation3.py但我找不到它的单个主页,并发现了几十个不同版本分散在Internet上.
例如,假设我有以下N3代表植物分类:
{
[]
:genus "Abies" ;
:species "alba" ;
:name [:value "Silver Fir" ; :usage "common" ; :language "English" ] ;
:name [:value "European Silver Fir" ; :usage "common" ; :language "English" ] ;
:name [:value "abeto blanco" ; :usage "common" ; :language "Spanish" ] ;
:name [:value "abeto plateado" ; :usage "common" ; :language "Spanish" ] ;
:name [:value "Edeltanne" ; :usage "common" ; :language "German" ] …Run Code Online (Sandbox Code Playgroud) 我一直在测试Sesame 2.7.2,当遇到DESCRIBE查询不包含空白节点关闭的事实时,我有一个很大的惊喜[ 编辑:正确的术语是CBD,用于简洁有界的描述 ]
如果我正确理解,SPARQL规范相当松散,并且说返回的内容实际上取决于提供者,但我仍然对选择感到惊讶,因为无法使用bnodes(在describe查询的结果中)在后续的SPARQL查询中.
所以问题是:如何在<uri1>不执行以下操作的情况下获得资源的封闭描述:
DESCRIBE <uri1>DESCRIBE ?b WHERE { <uri1> pred_relating_to_bnode_ ?b }如果我没有弄错的话,必须用深度2个bnodes来描述
DESCRIBE ?b2 WHERE {<uri1> <p1&> ?b . ?b <p2> ?b2 }
Run Code Online (Sandbox Code Playgroud)
除非有更简单的方法吗?
最后,让DESCRIBE一个资源的封闭描述让你仍然可以获得当前返回的结果并不是更好,更简单吗?
CONSTRUCT {<uri1> ?p ?o} WHERE {<uri1> ?p ?o}
Run Code Online (Sandbox Code Playgroud)
编辑:这是我想从芝麻回来的封闭结果的一个例子
<urn:sites#1> a my:WebSite .
<urn:sites#1> my:domainName _:autos1 .
<urn:sites#1> my:online "true"^^xsd:boolean .
_:autos1 a rdf:Alt .
_:autos1 rdf:_1 _:autos2
_:autos2 my:url "192.168.2.111:15001"@fr
_:autos2 my:url "192.168.2.111:15002"@en
Run Code Online (Sandbox Code Playgroud)
目前:DESCRIBE <urn:sites#1>返回与查询相同的结果CONSTRUCT WHERE …
我们想模拟"某些东西不在那里",而不是缺少信息,例如"患者未接受化疗"或"患者没有呼吸困难"的明确陈述与缺少患者是否有患者的信息不同呼吸困难.
我们考虑了几种方法,例如
使用空白节点描述个人属于没有呼吸困难的事物组.例如:
dat:PatientW2 a [ rdf:type owl:Class;
owl:complementOf [
rdf:type owl:Restriction ;
owl:onProperty roo:has_finding;
owl:someValuesFrom nci:Dyspnea;
]
] .
Run Code Online (Sandbox Code Playgroud)我们觉得第三种选择是表达这一点的最"本体论正确"的方式.但是,在使用它时,我们在简单的场景中遇到了严重的性能问题.
我们将Sesame与OWLIM-Lite商店一起使用,并将NCI词库(280MB,大约80,000个概念)和另一个非常小的本体导入商店,并添加了两个人,一个具有该补充/限制类.
以下查询永远执行,我在15分钟后终止它:
select *
where {
?s a [ rdf:type owl:Class;
owl:complementOf [
rdf:type owl:Restriction ;
owl:onProperty roo:has_finding;
owl:someValuesFrom nci:Dyspnea;
]
] .
} Limit 100
Run Code Online (Sandbox Code Playgroud)
有人知道为什么吗?我会假设这种方法会创建大量空白节点,并且查询引擎必须通过整个NCI词库并将所有空白节点与此进行比较?
如果我将此三元组放在单独的图形中并且仅查询该图形,则查询会立即返回结果.
总结一下.这两个基本问题是:
编辑1
我们讨论了提议的选项.它实际上帮助我们澄清了我们真正想要实现的目标:
我们希望能够在特定时间点陈述"患者有呼吸困难"或"患者没有呼吸困难".
在将来,可能/将会有关于该患者的更多信息,例如他/她现在患有呼吸困难.
我们希望能够编写Sparql查询,询问"所有患有呼吸困难的患者"和"所有没有呼吸困难的患者".
我们希望尽可能简单直观地保持Sparql.例如,只使用一个属性"has_finding",而不是必须知道两个属性(一个用于"has_exclusion").或者必须知道一些复杂的空白节点构造.
我们玩弄了各种选择:
owl:targetIndividual.而且我们找不到一种方法来轻易地查询负面断言,然后通过整个链owl:sourceIndividual和owl:targetIndividual链.这使得Sparql非常冗长,并且给编写查询的人带来了负担.补空的空白节点:我们会说这个我们不想陈述的东西.这将说明"患者1永远不会发现呼吸困难".虽然我们想说"患者1现在没有发现呼吸困难(或在第X天)".所以我们不应该使用这种方法.
使用排除/包含类型(选项1和2):仔细观察Jeen的建议后,我们认为使用一般:Exclusion和:Inclusion类以及仅一个属性has_finding并给予呼吸困难个体包含/排除类型是最容易理解,查询和提供足够的推理能力.例: …
我已经成功安装了Openrdf Repository(sesame 2.3.2)和Openrdf工作台但是我不知道如何设置用户和密码来保护Openrdf工作台.我想有--somewhere - 配置文件.
有人可以给我一个提示如何创建用户并为openrdf工作台设置密码?
sesame ×10
rdf ×5
sparql ×4
ontology ×2
performance ×2
semantic-web ×2
blank-nodes ×1
clojure ×1
database ×1
dependencies ×1
java ×1
jena ×1
maven ×1
modeling ×1
n3 ×1
openrdf ×1
passwords ×1
replace ×1
semantics ×1
seq ×1
triplestore ×1
virtuoso ×1