SPARQL地理空间查询(MarkLogic)

SPARQL地理空间查询(MarkLogic),sparql,marklogic,Sparql,Marklogic,从前面的问题继续。其中指出,在SPARQL查询中应避免避免使用fn:doc()。但是,除了下面显示的代码之外,对于地理空间查询,我无法找到其他解决方案。我也使用过这个查询,它的运行速度非常慢。对于较大的数据集,它将达到1小时超时 因此,我想问,是否有更好的方法实现SPARQL的地理空间查询?是否可以使用带有前缀spatial:的GEOSPARQL xquery版本“1.0-ml”; 导入模块命名空间sem=”http://marklogic.com/semantics“at”/MarkLogic

从前面的问题继续。其中指出,在SPARQL查询中应避免避免使用
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