SPARQL地理空间查询(MarkLogic)
从前面的问题继续。其中指出,在SPARQL查询中应避免避免使用SPARQL地理空间查询(MarkLogic),sparql,marklogic,Sparql,Marklogic,从前面的问题继续。其中指出,在SPARQL查询中应避免避免使用fn:doc()。但是,除了下面显示的代码之外,对于地理空间查询,我无法找到其他解决方案。我也使用过这个查询,它的运行速度非常慢。对于较大的数据集,它将达到1小时超时 因此,我想问,是否有更好的方法实现SPARQL的地理空间查询?是否可以使用带有前缀spatial:的GEOSPARQL xquery版本“1.0-ml”; 导入模块命名空间sem=”http://marklogic.com/semantics“at”/MarkLogic
fn:doc()
。但是,除了下面显示的代码之外,对于地理空间查询,我无法找到其他解决方案。我也使用过这个查询,它的运行速度非常慢。对于较大的数据集,它将达到1小时超时
因此,我想问,是否有更好的方法实现SPARQL的地理空间查询?是否可以使用带有前缀spatial:
的GEOSPARQL
xquery版本“1.0-ml”;
导入模块命名空间sem=”http://marklogic.com/semantics“at”/MarkLogic/semantics.xqy”;
导入模块命名空间thsr=”http://marklogic.com/xdmp/thesaurus"
位于“/MarkLogic/thesaurus.xqy”;
let$query:=sem:sparql(
'
前缀xs:
前缀cts:
前缀rdfs:
前缀fn:
前缀foaf:
前缀dc:
前缀db:
前缀到:
前缀rdf:
前缀xdmp:
挑选*
在哪里{
?人?问题。
过滤器(cts:contains(fn:doc(?people)),
路径地理空间查询(“/people\u data/location”,cts:circle(10,cts:point(59,28)))
)) .
}',
(),
(),
()
)
返回(xdmp:appeased-time())
=======更新========
问题转到我在这里看到两个选项:
- 或者使用内置于MarkLogic中的地理空间函数直接从SPARQL内部查找地理空间重叠,最好比较RDF属性,而不是路径索引中的值(仍然是次优)
- 更好:预先获取一个与地理空间约束匹配的文档列表,并将其作为约束提供给SPARQL(这应该是高性能的)
let $uris := cts:uris((), (), cts:path-geospatial-query("/people_data/location", cts:circle(10, cts:point(59,28))))
return sem:sparql('
SELECT *
WHERE{
?person </posted> ?question .
FILTER (?person = ?people) .
}
', map:entry("people", $uris))
API参考可在此处找到:
https://docs.marklogic.com/op
嗯 我不认为MarkLogic支持GeoSPARQL,至少他们的文档中没有提到它。@AKSW我知道是不是这样,当尝试同时使用geospatial+Sparql时,有什么推荐的方法吗?嗨,我读过optic api上的abit,它似乎可以在带有前缀的xquery中使用。您能给我看一个用于地理空间查询的示例光学api吗?谢谢@grtjnI通过一次相当有教育意义的尝试更新了答案,尽管还没有完全测试。我已经实现了如图所示的查询,一切正常,但出于某种原因,
op:join-internal
返回了一个空序列,另一方面,我尝试使用op:join left-outer
,它返回所有值,所有条目的sparql.person
都为null。我已经检查过,它们在lexicon.people
和sparql.person
上的值肯定是相同的。我已经从lexicon
和sparql
中更新了一个示例数据,值需要精确匹配/people/Aaren_DETERS/00001
和/people/Aaren_Howk/00001
不会匹配,尽管它们看起来非常相似..是的,这只是一段样本数据--有一些值完全匹配。例如,第3行lexicon.people的值与第27行sparql.person的值完全匹配。很抱歉,我对它进行了编辑以更改ID索引@grtjn
import module namespace op="http://marklogic.com/optic" at "/MarkLogic/optic.xqy";
let $people := op:from-lexicons(
map:entry("people", cts:uri-reference()),
"lexicon"
)
=> op:where(
cts:path-geospatial-query("/people_data/location", cts:circle(10, cts:point(59,28)))
)
let $questions := op:from-sparql('SELECT * WHERE { ?person </posted> ?question. }', "sparql")
return $people
=> op:join-inner(
$questions,
op:on(
op:view-col("lexicon", "people"),
op:view-col("sparql", "person")
)
)
=>op:result()
https://docs.marklogic.com/guide/app-dev/OpticAPI
https://docs.marklogic.com/op