我发现模型的RCS是一个有趣的问题,需要在数据持久化的环境中解决.它们是使用django ORM实现这种django-reversion和AuditTrail的几种解决方案,每种方法都提出了自己的方法.
这是我希望修改的模型(以django-model-like格式):
class Page(Model):
title = CharField()
content = TextField()
tags = ManyToMany(Tag)
authors = ManyToMany(Author)
Run Code Online (Sandbox Code Playgroud)
你会如何在你喜欢的db(Mongo,neo4j,CouchDb,GAE Datastore)中做到这一点?
请在每个帖子上仅发布一个RCS模型示例.
我不是要求一个完整的代码(也许解释是足够的?)但足以看到如何在每个数据库类型中解决这个问题.
sql persistence graph-databases key-value-store document-database
我正在使用Rails开发基于Web的应用程序.我正在讨论使用图形数据库(如InfoGrid)或文档数据库(如MongoDB).
我的应用程序需要存储一小组数据(如URL)和非常大的数据集(如虚拟机).此数据将绑定到单个用户.
我有兴趣了解人们使用Graph或Document数据库的经验以及为什么他们会使用其中任何一个选项.
谢谢
在处理几千个节点和几千个关系时,我应该使用哪个图形数据库?这些大数据是否适用于任何数据库?哪个图形数据库在读取操作中最快(假设所有数据在开始时加载一次).我看了看neo4j及其可视化工具.我可以在我的应用程序中使用这样的可视化工具吗?
我在Neo4j中发现了一个新的图形数据模型,我想知道如何列出所有可能的节点属性,但如果可能的话,不是它们的值.
对于这些关系,我发现了这个非常方便的通用密码查询:
start n=node(*)
match n-[r]-m
return distinct type(r)
Run Code Online (Sandbox Code Playgroud)
返回一个有用的属性列表,您可以开始使用它来更具体地查询图形:
==> +------------+
==> | type(r) |
==> +------------+
==> | "RATED" |
==> | "FRIEND" |
==> | "DIRECTED" |
==> | "ACTS_IN" |
==> +------------+
==> 4 rows
==> 0 ms
==>
Run Code Online (Sandbox Code Playgroud)
是否有任何函数/表达式允许执行此操作但是对于节点属性?
谢谢
我目前正在进入OrientDB进行研究,以评估图数据库的版本控制功能.
OrientDB中的每条记录都有一个@version属性,每次更新记录时都会增加.这为版本控制支持提供了指示.我已经设置了一个简单的例子(使用OrientDB SQL)来测试它:
create class Product
create property Product.name string
create property Product.price integer
insert into Product (name, price) values ('Fridge', 449)
update Product set price = 479 where name = 'Fridge'
select from Product
Run Code Online (Sandbox Code Playgroud)
执行上面的语句后,我得到以下查询结果:
{
"result": [
{
"@type": "d",
"@rid": "#14:0",
"@version": 2,
"@class": "Product",
"name": "Fridge",
"price": 479
}
],
"notification": "Query executed in 0.031 sec. Returned 1 record(s)"
}
Run Code Online (Sandbox Code Playgroud)
在此数据库状态中 - 如何检索记录的先前版本(在这个简单的情况下为版本1)?这是通过OrientDB SQL语句和/或通过OrientDB Java API实现的吗?如果不是 - 那么@version属性的目的是什么?
感谢您的帮助!
我有以下两种节点类型:
c:City {name: 'blah'}
s:Course {title: 'whatever', city: 'New York'}
Run Code Online (Sandbox Code Playgroud)
想要创造这个:
(s)-[:offered_in]->(c)
Run Code Online (Sandbox Code Playgroud)
我试图让所有与城市无关的课程与城市建立关系(如果不存在,城市就会被创造).然而,问题是我的数据集大约有500万个节点,并且我做出的任何查询超时(除非我增加10k).
......有人有什么建议吗?
编辑:
这是我现在正在运行的作业的查询(必须以10k块(数百万)完成,因为它需要几分钟.如果不存在则创建城市):
match (j:Job)
where not has(j.merged) and has(j.city)
WITH j
LIMIT 10000
MERGE (c:City {name: j.city})
WITH j, c
MERGE (j)-[:in]->(c)
SET j.merged = 1
return count(j)
Run Code Online (Sandbox Code Playgroud)
(现在不知道过滤掉已经匹配的好方法,所以试着用自定义"merged"属性标记它,我已经有了索引)
我正在为我的应用程序建模通用授权子域.这些要求非常复杂,因为它需要处理多租户,分层组织结构,资源组,用户组,权限,用户可编辑权限等.它是RBAC(分配给角色的用户,具有权限的角色,权限可以执行命令)与基于声明的身份验证的混合体.
在检查业务规则不变量时,我必须遍历权限"图"以找到用户对环境中的资源执行命令的权限.遍历深度在多个维度上是任意的.
我可以使用代码对此进行建模,但最好使用图形数据库来表示,因为此聚合上的查询/更新会更快.此外,它会降低代码本身的复杂性.但这需要图形数据库立即保持一致.
不过,我需要使用CQRS/ES,并启用分布式架构.
所以图数据库需要
这带来了一些缺点
但它有优势
在我建模的其他聚合中,我经常有一个EntityList实例或EntityHierarchy实例.它们基本上是子实体的有序/分层集合.他们的实施是任意的.它们可以支持索引,键值对,动态数组等任何内容.只要它们实现我为它们声明的接口.我经常甚至在这些实体(列表)上有findById()或类似的方法findByName().这些方法类似于可以在数据库上执行的方法,但它们是在内存中执行的.
那么,为什么不能实现这样一个可以绑定到数据库的列表呢?例如,TMemoryEntityList我会有一个,而不是一个TMySQLEntityList.在目前的情况下,可能需要实现一个TGraphAuthorizationScheme可以存在于TOrgAuthPolicy聚合内部的实现.只要它的行为类似于集合,并且它可以迭代并支持定义的接口.
我正在使用Node.js上的JavaScript构建我的应用程序.这个名为LevelGraph的内存实现.也许我也可以使用它.但是让我们继续吧.
我知道在DDD术语中,基础设施不应泄漏到域中.这就是我想要阻止的.这也是我提出这个问题的原因之一,就是这是我第一次遇到这样的技术需求,我要求那些习惯于应对这类问题的人提出一些建议.
集合的接口是IAuthorizationScheme.实现必须支持深度遍历,授权查找等.这是我正在考虑通过支持图形数据库来实现的接口.
序列 :
1当用户要求执行命令时,我首先验证他.我找到他的组织,并要求OrgAuthPolicyRepository加载他的组织的相应OrgAuthPolicy.
该OrgAuthPolicyRepository载荷从事件EventStore.
将OrgAuthPolicyRepository创建一个新的OrgAuthPolicy,具有依赖注入TGraphAuthorizationScheme实例.
该OrgAuthPolicyRepository应用所有以前的事件的OrgAuthPolicy,这进而调用图形数据库查询同步的状态GraphDatabase与集料.
命令处理程序执行业务规则验证检查.其中一些可能包括对聚合的检查IAuthorizationScheme.
已验证业务规则,并分派域事件.
聚合处理此事件,并将其应用于自身.这可能包括改变IAuthorizationScheme.
eventBus将事件调度到读取端的所有侦听eventHandler.
示例:
可以想象/希望使用外部数据库(例如图形数据库)实现实体,以便它们的实现更容易吗?如果是,是否有此类实施或指南的示例?如果没有,使用这种技术有什么缺点?
我打算将我开始构建的应用程序分解为带有图形数据库的巨型组件到微服务中.但我面临的困境是试图找到一个合适的解决方案来拆分不同的服务,而不是失去图数据库提供的好处.
我最初考虑的想法是将每个不同的实体分成它自己的微服务,使用文档存储来保存每个服务上的数据.然后定义更高级别的服务来管理关系.
例如,使用关系(A) - >(B),将产生3个微服务,一个服务用于类型A的实体,另一个用于类型B的实体,第三个更高级别用于图形数据库,存储类型的节点A和B,仅包含ID和它们之间的关系.
问题1:这种方法在耦合,容错或其他任何我现在无法想到的方面有什么问题吗?
问题2:当你将第三个实体投入游戏时,例如(A) - >(B),(A) - >(C)和(C) - >(B),哪一个将是这种情况下的最佳方法?
问题3:在相同类型的实体,例如间(人)的关系的情况下- isFriendOf - >(人),铭记的关注点分离的概念,它被appropiate以分离关系的管理进入不同的服务?
任何意见,反馈和想法都非常受欢迎.
我一直在研究这个问题,为了清楚起见,我会提出一个更具体的方案,所以讨论它会更容易.图模型将是这样的:
这里的目标是实现歌曲播放列表推荐服务,试图根据用户已经听过的歌曲中的流派和艺术家以及其他人听过的其他歌曲来找到给定用户尚未收听的歌曲.用户,后跟当前用户.
关于这两个工具的集成,我有几个问题.不是技术问题,也不是如何设置(我将在稍后讨论我的乐趣),但更多关于项目的进程和方向,看看JanusGraph还很年轻.
我正在开始一个新项目,并且已经决定使用Cassandra进行存储,并使用顶部声音图表对我很有吸引力.
在我走这条路之前,我想提前知道几件事.
JanusGraph非常年轻,它从大约一年前Titan离开的地方开始.那里存在差距,但是作为Linux基金会的一部分以及所有大型企业支持它的事实听起来很有希望.在这一点上假设JanusGraph会留在这里是否安全?依靠Janus作为启动项目是否安全?并且遵循当然的发展并尽可能地更新.
卡桑德拉.Titan/JanusGraph使用thrift api与Cassandra 2.1.9集成,最终将在Cassandra 4中弃用.我知道目前正在完成工作以使janus与Cassandra 3一起工作并最终使用CQL.从现有的janus和Cassandra 2.1.9开始并稍后处理迁移是否安全?创业公司处理这项任务是否是一项艰巨的任务?
生产就绪JanusGraph.(这个问题涉及到它早期阶段的任何软件以及它是否可以安全地启动使用).据我所知,JanusGraph需要一段时间才能完成生产并赶上其集成的其他工具(尽管我们说的工作正在完成:)).再次开始使用Janus并遵循开发并最终迁移到生产就绪版本是否安全?JanusGraph的整体路线图是什么?
我一般关注的是这些工具的组合是否是启动的安全选择.整个堆栈对我们来说已经是新的了,我们很高兴尝试学习,但我们将很快达到迁移期.这是你会做/推荐的事情吗?这是自杀吗?
请分享您的想法,并记住它不一定是关于我正在谈论的堆栈.它可能是任何初创公司在其早期阶段处理任何类型的软件.
干杯
在我学习如何使用Cosmos DB的图形时,我发现了两个Microsoft教程:
虽然我使用相同的查询,但它的执行不同.
使用Gremlin.Net,它立即执行.我经常(我会说70%的时间)得到一个RequestRateTooLargeException.如果我理解正确,这意味着我一直达到我选择的400RU/s限制.但是,当查询进入低谷时,它的速度是Microsoft.Azure.Graph解决方案的两倍.
实际上,使用Micorosft.Azure.Graph,我必须调用ExecuteNextAsync一个循环,一次返回一个结果.
所以问题是:
1°)我应该使用哪种方法来获得更好的性能?
2°)我怎么知道我的查询的RU所以我可以微调它?
3°)是否可以提高现有集合的吞吐量?
更新
问题3,我发现在我的数据库的"数据资源管理器"刀片中,我的图表有一个"Scale&Settings",我可以更新吞吐量.
Update2
问题2,我们无法在使用第一种方法(Gremlin.Net)时收取RU,但Microsoft.Graph方法ExecuteNextAsync返回FeedResponse带有字段的a RequestCharge.
graph-databases ×10
neo4j ×3
cypher ×2
cassandra ×1
cqrs ×1
database ×1
gremlin ×1
janusgraph ×1
orientdb ×1
persistence ×1
sql ×1
titan ×1
versioning ×1