MongoDB的类型模式理论。

metadb的Python项目详细描述


#db
这是一个实验性的mongoclient包装器,用于探索数据库模式。需要本地[MongoDB](https://www.mongodb.com/)才能运行。

`````
```
````
`````

` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 35;创建table
cli.create_table('hello-world')
cli.tables()

"HelloWorld’)


原始数据:
cli.items['hello-world'].find'u one()
>>gt;{"u id":objectid('5ae1561426142b93bcc3c3c6c3c6f60aaa11'),
"u type":objectid('5ae1561126112b93bcc3c3c6f60aaa10'),
'test':'hello,world'}




;规范化数据:
cli cli.index['hello-world'].find['hello-world'].find.find['hell_one()
>;>;{"u id":objectid('5ae156142b93bc3c6f60aa11'),
"u type":objectid('5ae15612b93bc3c6f60aa10'),
"https-www-wikidata-org-wiki-q45594":"您好,世界"}

cli.drop廑app('hello')
````

"一般想法"
1。假设我们有MongoDB(或任何类型的键值存储)。假设我们有数据库:

-`items`
-`types`
-`index`

>3。假设我们对保留集合'db["type s"]["u names"]`中名称的唯一性有一个约束,该集合表示应用程序注册表的全局命名空间:
```
使用类型

验证器:{
$和:[
{
"name":{$type:"string",$exists:true}
}
]
}
}


db.getcollection(''u names').createindex({"name":1},{unique:true})
```


4。假设我们有一个约定,每次在"items"数据库中创建一个新的collection时,每个记录都必须有`.u type'属性,这是来自MongoDB的对象ID。

例如:
````
use items

db.createcollection("app-1.0/model\u name",{
验证器:{
$和:[
{
"_type":{$type:"objectid",$exists:true}
}
]
}
}
}````

>5。假设`.u type`类似于对相应类型的外键引用,存储在具有相应名称的集合中的"types"数据库中。

``
use types

>types["app-1.0/model\u name"]
```

**推论:**这样,每个项都引用其类型,类型可以有历史记录,而不是模型的迁移。

例如,每当我们更改模型的模式时,我们可以简单地将新的instanced插入到与新模式对应的"types"数据库中。

5.1。假设'db['types'][''u types']`存储唯一的注册类型名。




6。假设"types"数据库的任何集合中的每个实例都遵循与"items"数据库中实例的模式相对应的模式,即实例树层次结构的上一层,如下所示:

```

{a':{b':{c':1}}

pattern:
{*':'obj','a':{b':{c':{'*':'int'}}

(这里,星号键指定每一级记录的信息,例如'c'是'int'的记录)
```

数据可能有一个"mask"指定值类型:

``python
from boltons.iterutils import remap


reserved_schema_key='*'


def generate_pattern(instance):
"
"根据数据中的第一条记录生成模式。
"


def解析类型(值):
返回类型(值)。如果IsInstance(实例,列表):
如果不是实例:
打印("如果Instance是列表,则必须为非空。")
返回
如果不是IsInstance(实例[0],dict):
打印("如果仪表是List,它的第一个元素必须是dict."
返回
else:
如果isInstance(instance,dict):
instance=[instance]
else:
print("instance必须是dict,或dict."
return

def visit(path,key,value):
如果没有([dict,list,tuple]]中t的isinstance(value,t)):
return key,{reserved_schema_key:parse_type(value)}
否则:
return key,值

remapped=remap(instance,visit=visit)
remapped[0][reserved_schema_key]="obj"
return remapped[0]


generate_pattern({'a':{'b':'c'})
```

通过提供对本体词汇表的引用(例如,url)和元组中数据类型规范化规则的信息,元组中的数据类型规范化规则由"like`ontological type转换规则"分隔,like so:

````
{'*':'http://www.omegawiki.org/definedmeaning:377726 lambda x:x,'a':{b':{'*':"https://www.wikidata.org/wiki/q11573 lambda x.replace(',','')}}
````

*注意:由于MongoDB无法将纯URL存储为密钥,因此将在数据库'db['types'][''u terms']`中存储正确的URL,并要求'name'的唯一性,因此:

```


db.createCollection("{terms",{
验证器:{
$和:[
{
"name":{$type:"string",$exists:true}
}
}
}
}
db.getCollection("''u names').createIndex({"name":1},{unique:true})
```


**推论:**每次创建一个新类型时,我们都可以创建相应的转换规则和本体元数据,并在将它们写入"index"数据库时,使用它来规范化数据实例(以下简称"规范化实例")。替换为掩码中的URL,值替换为转换规则的摘要。

7。让我们将规范化实例存储在"索引"数据库中。

**推论:**我们有一种按概念查询数据集的通用方法,并用任意人类语言表示它们的键以便于理解和分析。

**推论:**我们可以定义一个通用sql,它可用于按以下概念查询知识库:

`select*from(concept-id)`

例如:

`select*from<;humans>;`,`select*from<;best suppliers of..>;`,`select*from<;best people for..>;`

*注意:*它看起来类似于[sparql](https://en.wikipedia.org/wiki/sparql),但是对于来自所有可能词汇表而不是一个词汇表的通用概念,

**推论:*这样构造的数据库具有以下属性:

````

```

这种数据库可以方便地为通用应用程序创建通用的可伸缩后端,通过一个统一的接口,结构化和非结构化数据都可用于分析。



示例:

````
名称=['infinity']

collections=[
'infinity-0.1/注释'
'infinity-0.1/主题'
]


````

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java变量始终存储0值。为什么?   如何使用Java/REST将Azure blob从一个存储容器移动到另一个存储容器?   java将commons DBCP从1.2升级到1.4,我应该害怕吗?   java如何使用分隔符拆分字符串?   java使用数组读取json对象   java在groovy中切片字符串   交换数组java的两个邻域元素   java移动用于确定字符串是否为回文的逻辑   java Android应用程序在一个活动中崩溃   java Sparkjava将webapp文件夹设置为静态资源/模板的文件夹   java复杂条件表达式,用户易用。   java如何仅在表存在时从表中选择值   java I无法将数据从Recyclerview传递到其他活动   java数据结构最佳设计(大数据)   java Android从DatePickerDialogFragment中删除日历视图   java将数据从Firebase获取到片段   数组。sort()在java中运行不正常