Sparql-连接节点的多个类别的计数

Sparql-连接节点的多个类别的计数,sparql,Sparql,在我的图中,“文件”类别的节点拥有“多个不同类别的节点”。我试图获得一个文件列表,包括特定类别的连接节点数 我当前的最佳查询如下所示: SELECT ?uuid ?fileName ?tableCount ?toCount WHERE { ?uuid 'Category' 'File' . ?uuid 'Name' ?fileName . { SELECT (COUNT(*) as ?tableCount) WHERE {

在我的图中,“文件”类别的节点拥有“多个不同类别的节点”。我试图获得一个文件列表,包括特定类别的连接节点数

我当前的最佳查询如下所示:

SELECT ?uuid ?fileName ?tableCount ?toCount
WHERE {
    ?uuid 'Category' 'File' .
    ?uuid 'Name' ?fileName .
    {
        SELECT (COUNT(*) as ?tableCount)
        WHERE
        {
            VALUES (?category ) { ('BaseTable') }
            ?uuid 'Owns' ?elemUUID .
            ?elemUUID 'Category' ?category .
        }   
    }
    {
        SELECT (COUNT(*) as ?toCount)
        WHERE
        {
            VALUES (?category ) { ('TableOccurrence') }
            ?uuid 'Owns' ?elemUUID .
            ?elemUUID 'Category' ?category .
        }   
    }
}
输出是一个不同的文件列表,但计数是所有文件中该类别的计数,即每个文件共享相同的?toCount值,每个文件共享相同的?tableCount值


关于子查询的工作方式,显然有一些我不理解的地方。任何帮助都将不胜感激。

内部查询中的变量不在范围之外,除非它们出现在选择中。 您应该做的是这样的查询,请原谅我的编辑,但这也会让其他用户更容易遵循:

SELECT ?uuid ?fileName ?tableCount ?toCount
WHERE {
    ?uuid :category 'File' .
    ?uuid :name ?fileName .
    {
        SELECT ?uuid (COUNT(*) as ?tableCount)
        WHERE
        {
            VALUES (?category ) { ('BaseTable') }
            ?uuid :owns ?elemUUID .
            ?elemUUID :category ?category .
        }
        GROUP BY ?uuid   #This is the missing link
    }
    {
        SELECT ?uuid (COUNT(*) as ?toCount)
        WHERE
        {
            VALUES (?category ) { ('TableOccurrence') }
            ?uuid :owns ?elemUUID .
            ?elemUUID :category ?category .
        } 
        GROUP BY ?uuid  #and here again
    }
}

内部查询中的变量的作用域不在外部,除非它们出现在所选内容中。 您应该做的是这样的查询,请原谅我的编辑,但这也会让其他用户更容易遵循:

SELECT ?uuid ?fileName ?tableCount ?toCount
WHERE {
    ?uuid :category 'File' .
    ?uuid :name ?fileName .
    {
        SELECT ?uuid (COUNT(*) as ?tableCount)
        WHERE
        {
            VALUES (?category ) { ('BaseTable') }
            ?uuid :owns ?elemUUID .
            ?elemUUID :category ?category .
        }
        GROUP BY ?uuid   #This is the missing link
    }
    {
        SELECT ?uuid (COUNT(*) as ?toCount)
        WHERE
        {
            VALUES (?category ) { ('TableOccurrence') }
            ?uuid :owns ?elemUUID .
            ?elemUUID :category ?category .
        } 
        GROUP BY ?uuid  #and here again
    }
}

SPARQL计算是自下而上的,即首先是子查询-因此,它们不知道外部查询的绑定。。。但是,怎样才能以正确的方式完成这种累积呢?SPARQL计算是自下而上的,即首先是子查询-因此,它们不知道外部查询的绑定。好的,@unformedUser。。。但是,怎样才能以正确的方式完成这种积累呢?完美的,完全可以理解的。不过,我对这场演出并不是百分之百的兴奋。有没有更好的方法来实现这个目标,或者这就是方法?我相信没有其他方法可以实现你想要的。如果你有写权限,你可以像这样插入三元组:insert{a:hasTOCount?ct}WHERE{SELECT?a COUNT*AS?ct WHERE{…}GROUP BY?a},然后你可以直接查询。如果数据发生变化,这当然会过时。一些triplestore可以让你实现与上述相同的“规则”,但应该有助于保持系统的一致性。太好了。谢谢,@Valerio.Perfect,完全可以理解。不过,我对这场演出并不是百分之百的兴奋。有没有更好的方法来实现这个目标,或者这就是方法?我相信没有其他方法可以实现你想要的。如果你有写权限,你可以像这样插入三元组:insert{a:hasTOCount?ct}WHERE{SELECT?a COUNT*AS?ct WHERE{…}GROUP BY?a},然后你可以直接查询。如果数据发生变化,这当然会过时。一些triplestore可以让你实现与上述相同的“规则”,但应该有助于保持系统的一致性。太好了。谢谢你,瓦莱里奥。