我正在使用SQL Server 2008,我想要检索XML元素并返回元素本身及其属性,不带任何子元素和没有text().例如,以下XML有4个节点(doc,apple,b,banana):
<doc>
<apple type="bramley"> tasty <b>yum!</b> </apple>
<banana color="yellow" shape="bendy"> nice in smoothies </banana>
</doc>
Run Code Online (Sandbox Code Playgroud)
我想回复:
<doc/>
<apple type="bramley"/>
<b/>
<banana color="yellow" shape="bendy"/>
Run Code Online (Sandbox Code Playgroud)
例如,应该返回没有任何子节点的doc,并且应该在没有b子节点的情况下返回apple.但问题是,如果我使用SQL Server节点和查询方法,我无法删除子节点.使用SQL Server 2008,我最接近的是:
declare @x xml = '<doc>
<apple type="bramley"> tasty <b>yum!</b> </apple>
<banana color="yellow" shape="bendy"> nice in smoothies </banana>
</doc>';
select
c.query('local-name(.)') as Node,
c.query('for $e in . return <xx> {$e/@*} </xx>') as Attr
from @x.nodes('//*') as T(c);
Run Code Online (Sandbox Code Playgroud)
这将获取每个节点的名称(使用local-name)和节点的属性并返回:
Node Attr
---- ----
doc <xx />
apple …Run Code Online (Sandbox Code Playgroud) 在 SQL Server 2008 R2 联机丛书中,这意味着分组列的最大列大小为 8060 字节。
“对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expression 项的数量受到 GROUP BY 列大小、聚合列以及查询中涉及的聚合值的限制。此限制源于 8,060 字节的限制保存中间查询结果所需的中间工作表。”
但您可以按 varbinary (max) 列进行分组:
create table dbo.T(
name varchar(100),
info varbinary(max)
);
insert into dbo.T values ('aardvark', Convert(varbinary(max),Replicate(Convert(varchar(max),'A'),100000)))
select info, count(*) from T group by info;
Run Code Online (Sandbox Code Playgroud)
上面的代码在 SQL Server 2008 R2 以及可能更高的版本中运行良好。我是否误读了在线书籍?有谁知道是否允许按大对象类型分组?我也用谷歌搜索过这个没有结果。
我想开始使用DBpedia.目前我所知道的是,DBpedia是维基百科数据的结构化形式,可以使用SPARQL进行查询.对我来说,DBpedia的基本思想(给维基百科数据的结构)看起来真的太棒了,所以如果我的问题是基本的,请放轻松.
我的目标
从DBpedia获取简单的数据摘录.例如世界各国及其首都和人口.或者获得100名随机名人,他们的日期和出生地以及简短的描述.最终我想查询元数据以查找DBpedia中的"实体"类型(例如山脉?里弗斯?城市?)及其"属性".但这是一个单独的问题,一旦我掌握了基础知识,我就可以进行实验.
到目前为止我发现了什么
在谷歌我找到了http://wiki.dbpedia.org/develop/getting-started,但我认为它是关于安装所有的DBpedia,我只想查询它.
另外我发现https://mickael.kerjean.me/2016/05/20/walkthrough-dbpedia-and-triplestore/但它假设您已经设置了SPARQL或SNORQL,我看不到如何执行此操作.
麻生太郎我找到了https://docs.data.world/tutorials/sparql/Your_First_Sparql_Query.html这是SPARQL的指南,但它再次假设你正在使用他们自己的DataWorld环境.
在Stackoverflow上,我从DBpedia找到了来自DBpedia和List国家的列表国家,但他们再次假设您已经设置了SPARQL环境.
问题(S)
我一直试图深入了解这些概念是如何相关的.让我举一个简单的例子,解释一下思考,以便你能够纠正它.
假设我想尝试对两个数组进行排序
int[] A = { ... }; // very large, very unsorted
int[] B = { ... }; // very large, very unsorted
Run Code Online (Sandbox Code Playgroud)
通过对它们进行排序"与我的系统并行,我可以对它们进行排序".我充分利用了这样一个事实,即Parallel.ForEach做了很多东西,我只是写
var arrays = new List<int[]>(A, B);
Paralell.ForEach(arrays, (arr) => { Array.Sort(arr); });
Run Code Online (Sandbox Code Playgroud)
现在让我说我在具有以下规范的机器上编译并运行它:
在情况1中,绝对不可能获得性能增益.它对A进行排序,然后对B进行排序,就像在常规foreach循环中一样.
在案例2中,也没有性能提升,因为除非你有多个处理器,否则你的机器不能"一次做多于一件事. "即使最终在不同的线程中对它们进行排序,控制线程的CPU也会A的一点排序,B的一点点排序,A的一点点等等,这不仅仅比排序所有的A然后全部的B更有效.
由于前一种情况中提到的原因,案例3是唯一可能获得性能提升的案例.
有人会批评我的理解吗?这是对还是错?(我没有计算机科学专业.所以请在曲线上给我评分.)