2017-05-04 20 views
0

다음과 같은 RDF 트리플의 모음이 있습니다.SPARQL에서의 스타 서브 그래프 패턴 찾기

id#7289587 ex:getInfectedBy id#7748320 
id#7694711 ex:getInfectedBy id#7748320 
id#7748322 ex:getInfectedBy id#7748320 
id#7748887 ex:getInfectedBy id#7748320 

id#7746679 ex:getInfectedBy id#7748510 
id#6434108 ex:getInfectedBy id#7748510 
id#7458397 ex:getInfectedBy id#7748510 

내 목표는 다양한 노드 길이 (4,5,6, ..., 20)의 스타 서브 그래프 패턴을 계산하는 것입니다. 예를 들어, 다음 쿼리를 작성하여 노드 길이가 4 인 스타 서브 그래프 패턴을 찾으십시오 (? s1? s2? s3? o). 두 노드 id#7748320id#7748510에 대한

SELECT ?o count(distinct ?o) 
WHERE 
{ 
    ?s1 ?p ?o. 
    ?s2 ?p ?o. 
    ?s3 ?p ?o.FILTER((?s1!=?s2) && (?s1!=?s3) && (?s2!=?s3)) 
} group by ?o 

노드 4 위에서 언급 한 쿼리 카운트 스타 패턴 길이. 그러나 노드 id#7748510에 대해서만 결과를 제공한다고 가정합니다. 5 노드 스타 패턴으로 쿼리를 수정하면 노드 id#7748320도 나타납니다. 고칠 수 있도록 도와 주시겠습니까?

다양한 노드 길이 (4,5,6, ..., 20)의 스타 서브 그래프 패턴을 하나의 쿼리로 계산할 수 있습니까? 저에게 알려주세요. 도와 주셔서 감사합니다.

+0

단순히 사용을'* WHERE SELECT' 쿼리를 사용하여 SPARQL에서 이것이 올바른지 확인하십시오. id # 7748320 노드의 데이터가 SPARQL 쿼리의 패턴과도 일치한다는 것은 명백합니다. 쿼리에서 "적어도"해당 요구 사항을 만족시키는 것이 무엇인지 묻는 것입니다. – AKSW

답변

1

내 댓글뿐만 아니라, 단순히 HAVING를 사용하여 필터링 한 후 "계산 노드 당 들어오는 모든 노드"를 다른과보다 효율적인 쿼리를 사용합니다 :

SELECT ?o (COUNT(DISTINCT ?s) AS ?cnt) 
WHERE 
    { ?s ?p ?node } 
GROUP BY ?o 
HAVING (?cnt = 3) # three incoming nodes 
+0

답장을 보내 주셔서 감사합니다. 나는 당신이''node''가 아니라''o''라고 생각합니다. 거장 SPARQL 엔드 포인트에서 제공 한 쿼리를 실행했습니다. 'Virtuoso 37000 Error SP031 : SPARQL compiler : 변수? cnt가 집계 밖의 결과 집합에 사용되고 GROUP BY 절에 언급되지 않았습니다 .'라는 오류가 발생합니다. 친절하게 대답 해주세요. –

+1

다음과 같이 HAVING 절을 수정하면 작동합니다 : HAVING (COUNT (DISTINCT? s) = 3)'. 당신의 도움을 주셔서 대단히 감사합니다. –

+0

맞습니다. 집계 결과가 여전히 범위에 있지만 어쨌든 오류가보고되는 경우에는 Virtuoso에 문제가 있다는 것을 잊었습니다. – AKSW