问题描述
在我的图中,“文件”类别的节点“拥有”许多不同类别的节点。我正在尝试获取文件列表,包括特定类别的连接节点数。
我目前最好的查询如下所示:
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
}
}