2016-10-21 4 views
0

를 얻기 위해 결과 어떻게 든 쿼리하고 도메인의 고유 목록을 얻으시겠습니까? 이 예에서는 www.ex.comwww.google.com입니다. 이 같은구문 분석 SPARQL은이 같은 트리플의 거대한 목록을 가지고 호스트 이름을

뭔가를해야만 :

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

그러나 각 URL 바인딩을 치료. 당연히 나는 그들을 모두 얻을 수 있고, 나의 프로그램에서 각 URL을 하나씩 다루지 만, 나는 sparql 질의가 더 효율적인 메모리라고 생각한다. Stardog를 사용하고 있습니다 - 사용자 정의 기능이있는 경우에 대비해.

+0

URL의 도메인을 새 변수로 바인딩 한 다음이 변수를 SELECT 할 수 있습니다. String 연산과 REGEX에 대한 SPARQL 스펙을 참조하십시오. '/'가 처음 나타날 때까지 부분 문자열과 같은 것이 작동해야합니다. – AKSW

+0

URL의 도메인을 새 변수에 바인딩하는 방법에 대해 자세히 설명해 주시겠습니까? 나는 REGEX 연산을 알고 있지만, 필터를 통해 결과를 버리는 것 같다. – user1156544

답변

2

사용 REPLACEREGEX과 :

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

Example in Yasgui

편집 :

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

: @JoshuaTailor이 코멘트에 언급 한 바와 같이 URL에 어떤 계획이없는 경우 STRBEFORE 낫다 URL 스킴에 대해 걱정할 필요가있는 경우 (스킴을 삭제 함) :

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

물론 위의 내용은 기본 http (s) URL에서만 작동하며 임의 URL을 처리해야하는 경우 정규식이 다소 복잡해집니다. 매우 느릴 수 있습니다 정규 표현식 쿼리

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

참고 :

여기에 일부 또는 실종 체계, 포트 번호, 인증 정보를 처리 하나, 누락 후행 슬래시입니다.

+0

두 번째 Regex가 훌륭하게 작동한다! 감사! 첫 번째 것은 http : //만을 반환하기 때문에 내 경우에는 더 튜닝이 필요하다고 생각되지만 두 번째는 좋습니다. 당신이 말했듯이 매우 비싸기 때문에 나는 성능 테스트를 할 것입니다. – user1156544

+0

정규식을 사용할 필요가 없습니다. STRBEFORE를 사용하고'/'앞에있는 문자열을 얻을 수 있습니다. 두 번째 REGEX는'ftp'와 같은 비 HTTP (S) URL에서는 작동하지 않습니다. 이것은 인증 정보와 포트 정보를 포함하는 URL에도 문제가 있습니다 (예 :'http : // user : password @ example.org : 8080/index.html', 여기서'user : [email protected] : 8080'을 얻을 수 있습니다. –

+0

그건 그렇고, 제 1 질문도 제 질문에 맞아야합니다 - 제 실수입니다. 실제 데이터에는 스키마 (http : // ...)가 있습니다. – user1156544

5

정규 표현식을 필요로하지 않는 문자열 조작을 사용하여 이와 같은 작업을 수행 할 수 있습니다.

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의 캐릭터 라인 형식의 참여할 수 정규식 기능을 사용하는 솔루션입니다. URL이 HTTP 같은 경우

그러나, 이것은 여전히, 예를 들어 호스트 이름, 것보다 더 많은 것을 얻을 수 있습니다 : // 사용자 이름 : [email protected] : 8080, 당신은 이름을 불렀 : 암호 @ example.org : 8080, 이는 단지 호스트 명 이상의 것입니다.

이 작업을보다 자세히 수행하려면 RFC 3986과 같은 URI/URL 등의 사양 중 하나를 선택하고 구문 구성 요소에 대한 섹션을 참조하십시오.그 문법에서 몇 관련 작품은 다음과 같습니다

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가 꽤 복잡 할 수 있기 때문에 가장 신뢰할 수있는 솔루션입니다.

+0

질문의 예와 같이 URL이 완료되지 않은 경우 STRBEFORE + STRAFTER가 작동하지 않습니다 (스키마가 없음). 분명히 이것은 실제 데이터. – evsheino

+0

마지막 단락에 동의합니다 .URL 파싱 라이브러리를 사용하면 프로그램을 작성하는 가장 강력한 방법처럼 들리지만 해결 방법을 확인하고 3 가지 옵션 중 성능이 우수한 것을 항상 확인합니다. 감사합니다. – user1156544

관련 문제