1

次のようなトリプルの膨大なリストがあります。

?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 を 1 つずつ処理することもできますが、sparql クエリの方がメモリ効率が高いと思います。カスタム機能がある場合に備えて、Stardog を使用しています。

4

2 に答える 2

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" |
---------------------------------------------------

これは正規表現を使用しないため、正規表現関数を使用したソリューションよりも高速になる可能性があります。

ただし、これはまだホスト名以上のものを取得する可能性があります。たとえば、URL がhttp://username:password@example.org:8080のような場合、 username:password@example.org:8080が取得されます。単なるホスト名ではありません。

これをより慎重に行うには、 RFC 3986などの URI/URL などの仕様の 1 つを選択し、構文コンポーネントに関するセクションを参照してください。その文法からのいくつかの関連する作品は次のとおりです。

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

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

権限コンポーネントの前には二重スラッシュ (「//」) があり、次のスラッシュ (「/」)、疑問符 (「?」)、番号記号 (「#」) 文字、または末尾で終了します。 URIの。

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

すべてを処理するわけではありません (複雑なケースを処理するために正規表現を使用する方が理にかなっているかもしれません) が、SPARQL の結果から URI を取得し、実際の URI 解析ライブラリを使用するのが最も簡単かもしれません。ホスト名を取得します。URI は非常に複雑になる可能性があるため、これが最も信頼できるソリューションです。

于 2016-10-21T21:41:28.513 に答える