解析SPARQL结果以获取主机名

时间:2016-10-21 15:49:01

标签: sparql stardog

我有很多这样的三元组列表:

?s ex:url ?url

?url可以是:

www.ex.com/data/1.html
www.ex.com/data/2.html
www.google.com/search
...

使用SPARQL查询是否有可能以某种方式过滤查询并获取不同的域列表?在示例中,www.ex.comwww.google.com

像这样:

SELECT distinct ?url
WHERE { ?s ex:url ?url }

但是对待每个url绑定。当然我可以全部获取它们,并在我的程序中逐个处理每个URL,但我认为sparql查询会更有效。我正在使用Stardog - 以防它具有一些自定义功能。

2 个答案:

答案 0 :(得分:5)

你可以使用不需要正则表达式的字符串操作来做这样的事情。例如,您可以在" //"之后获取URL的字符串形式的一部分。在" /":

之前
select ?url ?hostname {
  values ?url { <http://example.org/index.html> }
  bind(strbefore(strafter(str(?url),"//"),"/") as ?hostname)
}
---------------------------------------------------
| url                             | hostname      |
===================================================
| <http://example.org/index.html> | "example.org" |
---------------------------------------------------

它不使用正则表达式,并且可能比使用正则表达式函数的解决方案更快。

但是,这可能仍会让您获得更多主机名,例如,如果网址类似于 http:// username:password@example.org:8080 ,您可以在其中获取用户名:password@example.org:8080 ,这不仅仅是主机名。

为了更加谨慎地执行此操作,您需要选择其中一个URI / URL等规范,例如RFC 3986,并查看有关语法组件的部分。该语法的一些相关产品是:

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

      hier-part   = "//" authority path-abempty
                  / path-absolute
                  / path-rootless
                  / path-empty
     

权限组件前面有一个双斜杠(&#34; //&#34;)并且是   由下一个斜杠(&#34; /&#34;),问号(&#34;?&#34;)或数字终止   签名(&#34;#&#34;)字符,或URI的末尾。

authority   = [ userinfo "@" ] host [ ":" port ]

我不会完成所有这些工作(也许使用正则表达式来处理复杂的情况会更有意义),但是从SPARQL结果获取URI然后使用它可能是最简单的获取主机名的实际URI解析库。这是最可靠的解决方案,因为URI可能相当复杂。

答案 1 :(得分:2)

REPLACE使用REGEX

BIND(REPLACE(STR(?url), "^(.*?)/.*", "$1") AS ?domain)

Example in Yasgui

编辑:正如@JoshuaTailor在评论中指出的那样,如果没有方案,STRBEFORE会更好吗?url:

BIND(STRBEFORE(?url, "/") AS ?domain)

如果您需要担心URL方案(这会丢弃该方案):

BIND(REPLACE(STR(?url), "^(https?://)?(.*?)/.*", "$2") AS ?domain)

当然,以上只适用于基本的http(s)URL,如果需要处理任意URL,正则表达式会变得更复杂。

这是一个处理任何或缺少方案,端口号,身份验证信息和缺少尾部斜杠的方法:

BIND(REPLACE(?url, "^(?:.*?://)?(?:.*?@)?([^:]+?)(:\\d+)?((/.*)|$)", "$1") AS ?domain)

请注意,使用正则表达式的查询可能会非常慢。