Sparql 使用光学API进行地理空间查询(MarkLogic)

Sparql 使用光学API进行地理空间查询(MarkLogic),sparql,marklogic,Sparql,Marklogic,问题来自。我目前正在尝试使用光学API使用SPARQL和CTS进行搜索。我尝试使用以下代码 使用的查询 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:pa

问题来自。我目前正在尝试使用光学API使用SPARQL和CTS进行搜索。我尝试使用以下代码

使用的查询

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(7500, cts:point(89.39101918779838, 51.97989163203445)),
    "type=long-lat-point")
  )

let $questions := op:from-sparql('SELECT * WHERE {?person </has_dob> ?dob. }', "sparql")

return $questions  => op:join-inner(
    $people,
    op:on(
      op:view-col("lexicon","people"),
      op:view-col("sparql", "person")
    )
  ) => op:result()
sparql.person

......
{"sparql.person":"/people/Aaren_CRIBLEZ/000000000087536", "sparql.dob":"1999-07-21T00:19:21"}
{"sparql.person":"/people/Aaren_DEBRITO/000000000049208", "sparql.dob":"2018-10-09T08:09:48"}
{"sparql.person":"/people/Aaren_DEMASTERS/000000000091082", "sparql.dob":"2014-08-21T06:43:44"}
{"sparql.person":"/people/Aaren_DETERS/000000000055933", "sparql.dob":"2011-09-11T02:44:22"}
{"sparql.person":"/people/Aaren_GARY/000000000100658", "sparql.dob":"1998-06-04T00:39:23"}
{"sparql.person":"/people/Aaren_HANNAWAY/000000000045087", "sparql.dob":"2002-06-17T05:45:15"}
{"sparql.person":"/people/Aaren_HOWK/000000000117433", "sparql.dob":"2002-06-21T06:00:34"}
{"sparql.person":"/people/Aaren_HUSTEDT/000000000038649", "sparql.dob":"2018-06-07T14:56:39"}
{"sparql.person":"/people/Aaren_JURICH/000000000039301", "sparql.dob":"2003-07-14T16:20:05"}
{"sparql.person":"/people/Aaren_KRACK/000000000101407", "sparql.dob":"2014-03-19T06:25:39"}
{"sparql.person":"/people/Aaren_MACCONNELL/000000000053205", "sparql.dob":"1995-06-21T16:15:53"}
.....
我还做了一些额外的测试,其中使用
op:fromsparql

let $query = 'SELECT * WHERE {?person </has_age> ? age . 
                              FILTER(?age > 75)}'
let $questions2 := op:from-sparql($query, "sparql2")
==更新2==

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(7500, cts:point(89.39101918779838, 51.97989163203445)),
    "type=long-lat-point")
  )

let $questions := op:from-sparql('SELECT * WHERE {?person </has_dob> ?dob. }', "sparql") 
                => op:select(( "dob", op:as('personStr',ofn:string(op:col('person'))) ))

return $questions  => op:join-inner(
    $people,
    op:on(
      "people","personStr"
    )
  ) => op:select(("personStr","dob")) => op:count("Row Count", "personStr") => op:result()
导入模块命名空间op=”http://marklogic.com/optic“at”/MarkLogic/optic.xqy”;
let$people:=op:来自词典(
map:entry(“people”,cts:uri-reference()),
“词汇”
)=>op:在哪里(
路径地理空间查询(“人/数据/位置”,
cts:圆(7500,cts:点(89.39101918779838,51.97989163203445)),
“类型=长lat点”)
)
让$questions:=op:fromSPARQL('SELECT*WHERE{?person?dob.}',“sparql”)
=>op:select((“dob”,op:as('personStr',of n:string(op:col('person')))
return$questions=>op:join-internal(
万人,
op:on(
“人”,“人”
)
)=>op:select((“personStr”,“dob”))=>op:count(“行计数”,“personStr”)=>op:result()

我认为URI词典的类型为xs:string,三个主题的类型通常为sem:iri

检查的一种方法是在SPARQL行上使用op:select()和oxs:string()光学表达式,在内部联接之前将主题值强制转换为字符串

如果这样做有效,那么使用TDE模板创建具有xs:string数据类型而不是sem:iri数据类型的主题可能会有所帮助


希望这能有所帮助,

我已经尝试编写了铸造所需的代码,这些代码可以在我更新的问题中找到。我希望您能快速查看一下,看看我的方法是正确的还是错误的。谢谢@ehennum这看起来是一个合理的方式来做演员。只是想检查一下,测试是否修改了连接,将person\u字符串列与people一起使用,而不是将person与people一起使用?是的。但是,我在声明
XDMP-BADCHAR:(err:XPST0003)时遇到了一个错误,发现了意外的字符“\ux”
。我假设这是因为“\u1”不是有效的字符串类型@ehennumI也尝试使用
xs:string(op:col('person'))
进行强制转换,但在声明
XDMP-cast:(err:FORG0001)xs:string(op:col('person'))时遇到一个错误--无效的强制转换:map:map(强制转换为xs:string
我还使用了
XDMP:type()
来检查我的
op:result()
来自
$people
,这会导致许多行
类型。很抱歉,我错过了昨天的问题。表达式应该导入ofn或oxs库,对列值执行延迟表达式函数,而不是立即对列标识符执行fn:*()和xs:*()函数。请参阅
let $questions := op:from-sparql('SELECT * WHERE {?person </has_dob> ?dob. }', "sparql")
                => op:select((  "person", op:as('person_string',fn:string(op:col('person'))) ))
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(7500, cts:point(89.39101918779838, 51.97989163203445)),
    "type=long-lat-point")
  )

let $questions := op:from-sparql('SELECT * WHERE {?person </has_dob> ?dob. }', "sparql") 
                => op:select(( "dob", op:as('personStr',ofn:string(op:col('person'))) ))

return $questions  => op:join-inner(
    $people,
    op:on(
      "people","personStr"
    )
  ) => op:select(("personStr","dob")) => op:count("Row Count", "personStr") => op:result()