- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Document 和 Revision 是驻留在我们领域逻辑特定层中的两个对象。
Document 表示围绕您能想到的任何 Material 纸的抽象。也就是说 - 每份契约(Contract)、发票或图纸都可以称为文件。
另一方面,文档的 Material 表示是修订:建筑工程师在现场收到的文件 list 代表修订 设计者创建的文档。如果由于错误或更改要求而必须更改绘图中的某些内容,则新的修订版将出现在站点上 - Revision #2 是同一文档。
修订 可能包含指向其他文档 的链接;因此,我们可以描述汽车、车门、发动机、车轮等之间的关系,以及每个元素独立进化的可能性,同时保持与其他元素的联系。
一个典型的DAG显示:
我设法使用 C# Graph API 将所有顶点和边插入到 CosmosDB 中.我设法遍历图表并执行简单的查询,以找出汽车有多少次修改,或者发动机在最初创建时是否有涡轮增压器。但是,我正在努力编写一个复杂的查询,该查询仅返回每个零件或汽车的最新修订版,或者返回 2016 年 8 月 10 日之前汽车状态的查询。
当遍历访问一个顶点(它的“out()”)的后代时,我无法找到一种方法来获取最近创建的并继续遍历而不挖掘其他顶点。如果您建议我一个表达式,我将不胜感激,它只返回图片中的彩色顶点。
最佳答案
虽然图片很有帮助,但在询问有关 Gremlin 的问题时,始终提供可以生成图形示例的 Gremlin 脚本会很有帮助。例如,对于您的问题:
graph = TinkerGraph.open()
g = graph.traversal()
g.addV('car').property('name','car').as('car').
addV('rev').property('name','car revision 1').property('date', 1470787200L).as('carV1').
addV('rev').property('name','car revision 2').property('date', 1472688000L).as('carV2').
addV('frontLeftDoor').property('name','front left door').as('frontLeftDoor').
addV('frontRightDoor').property('name','front right door').as('frontRightDoor').
addV('engine').property('name','engine').as('engine').
addV('turbocharger').property('name','turbocharger').as('turbocharger').
addV('rev').property('name','front left door revision 1').property('date',1470787200L).as('frontLeftDoorV1').
addV('rev').property('name','front left door revision 2').property('date',1472688000L).as('frontLeftDoorV2').
addV('rev').property('name','front right door revision 1').property('date',1470787200L).as('frontRightDoorV1').
addV('rev').property('name','engine revision 1').property('date',1470787200L).as('engineV1').
addV('rev').property('name','engine revision 2').property('date',1472688000L).as('engineV2').
addV('rev').property('name','engine revision 3').property('date',1483401600L).as('engineV3').
addV('rev').property('name','turbocharger revision 1').property('date',1470787200L).as('turbochargerV1').
addV('rev').property('name','turbocharger revision 2').property('date',1472688000L).as('turbochargerV2').
addE('relates').from('car').to('carV1').
addE('relates').from('car').to('carV2').
addE('relates').from('carV1').to('frontLeftDoor').
addE('relates').from('carV1').to('frontRightDoor').
addE('relates').from('carV1').to('engine').
addE('relates').from('carV2').to('frontLeftDoor').
addE('relates').from('carV2').to('frontRightDoor').
addE('relates').from('carV2').to('engine').
addE('relates').from('frontLeftDoor').to('frontLeftDoorV1').
addE('relates').from('frontLeftDoor').to('frontLeftDoorV2').
addE('relates').from('frontRightDoor').to('frontRightDoorV1').
addE('relates').from('engine').to('engineV1').
addE('relates').from('engine').to('engineV2').
addE('relates').from('engine').to('engineV3').
addE('relates').from('engineV2').to('turbocharger').
addE('relates').from('engineV3').to('turbocharger').
addE('relates').from('turbocharger').to('turbochargerV1').
addE('relates').from('turbocharger').to('turbochargerV2').iterate()
与开发提供答案的 Gremlin 相比,回答问题的人通常需要更多时间来为问题创建样本图。
无论如何,这是一种使用“8/10/2016”作为“开始日期”的方法:
gremlin> g.V().has('name','car').
......1> repeat(local(out().has('date',lte(1470787200L)).
......2> order().
......3> by('date',decr).limit(1)).
......4> out()).
......5> emit().
......6> local(out().has('date',lte(1470787200L)).
......7> order().
......8> by('date',decr).limit(1)).
......9> tree().by('name')
==>[car:[car revision 1:[front right door:[front right door revision 1:[]],engine:[engine revision 1:[]],front left door:[front left door revision 1:[]]]]]
这是具有不同日期的相同遍历 - “1/1/2017”:
gremlin> g.V().has('name','car').
......1> repeat(local(out().has('date',lte(1483228800L)).
......2> order().
......3> by('date',decr).limit(1)).
......4> out()).
......5> emit().
......6> local(out().has('date',lte(1483228800L)).
......7> order().
......8> by('date',decr).limit(1)).
......9> tree().by('name')
==>[car:[car revision 2:[front right door:[front right door revision 1:[]],engine:[engine revision 2:[turbocharger:[turbocharger revision 2:[]]]],front left door:[front left door revision 2:[]]]]]
在这种情况下,看到“engine revision 3”被排除在外,因为它是“1/1/2017”之后的唯一顶点 - 树的其余部分存在。
一些注意事项:
has()
的 lte
谓词的日期,但如果可以的话,您可能更愿意走那条路。<repeat()
步骤允许在树中进行任意深度遍历,但请注意它在 emit()
之后包含的重复逻辑 - 这捕获了repeat()
中的最终“树叶”循环结束,因为没有更多的 outE()
可以遍历。 repeat()
里面的逻辑看起来有点复杂,但基本上就是说对当前的“文档”遍历所有的“修订版”,按日期降序排序并抓取第一个。一旦它具有由您关心的日期控制的最新版本,遍历它连接到的任何其他文档。tree()
步骤,因为 CosmosDB 似乎支持它。看起来他们还不支持 subgraph()
。从技术上讲,Apache TinkerPop C# Gremlin 语言变体甚至不支持该步骤 - 那里存在一些挑战,不幸的是,Java 仅具有此功能。幸运的是,您的数据的形状是树状的,所以 tree()
步骤似乎足够了。在 Groovy 中,您可以通过闭包的方式提供重复的逻辑,使事情更容易重用:
gremlin> traverseAndFilter = { out().has('date',lte(1470787200L)).
......1> order().
......2> by('date',decr).limit(1) }
==>groovysh_evaluate$_run_closure1@1d12e953
gremlin> g.V().has('name','car').
......1> repeat(local(traverseAndFilter()).out()).
......2> emit().
......3> local(local(traverseAndFilter())).
......4> tree().by('name')
==>[car:[car revision 1:[front right door:[front right door revision 1:[]],engine:[engine revision 1:[]],front left door:[front left door revision 1:[]]]]]
或存储“traverseAndFilter”遍历本身和clone()
它:
gremlin> traverseAndFilter = out().has('date',lte(1470787200L)).
......1> order().
......2> by('date',decr).limit(1);[]
gremlin> g.V().has('name','car').
......1> repeat(local(traverseAndFilter.clone()).out()).
......2> emit().
......3> local(local(traverseAndFilter.clone())).
......4> tree().by('name')
==>[car:[car revision 1:[front right door:[front right door revision 1:[]],engine:[engine revision 1:[]],front left door:[front left door revision 1:[]]]]]
关于azure-cosmosdb - 如何获得由满足特定条件的所有顶点组成的子图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44881401/
编辑:我将问题重新表述为更简单且不那么特定领域的问题: 在下面的代码中,我想实现 mplus 函数,该函数结合了受特定字段存在约束的两个函数。结果函数应受两个字段的存在的约束。 谢谢 ! import
我的代码有什么问题?提前致谢! 我正在尝试为我的 docker 容器设置一个虚拟主机。在本地主机上:8000 完美运行,但是当我尝试通过 http://borgesmelo.local/访问时,出现错
这个问题在这里已经有了答案: CSS technique for a horizontal line with words in the middle (34 个答案) 关闭 2 年前。 首先,这是
我是 React Js 的新手,并尝试了解如何通过 ajax 对从不同来源获得的数据进行组合(如下所述: Reactjs - loadResourcesFromServer - combine two
我一直在关注 this tutorial在 docker 服务和 swarms 上。但是我在不同 docker 容器之间的网络连接上遇到了一些问题。 以下是我的 docker-compose.yml
我正在尝试创建一个相对简单的设置来开发和测试 npm 包。事实上,一个问题是,在将代码卷安装到容器后,它会替换 node_modules。 我尝试了很多通常合乎逻辑的东西,主要是为了将 node_mo
我有四种类型A、B、C和D,初始值x Future[Option[A]] 和三个函数:f1: A => Option[B] , f2: B => Future[Option[C]] 和 f3: C =
我有一个包含单词的语料库。我想对他们做一个分析。我接受它们是土耳其字符,但其中一些不是。所以我想检查一个词是否不包含土耳其字符或数字。我的意思是: hey4 valid 33 vali
这是我正在为 Java 入门课解决的学校问题。作业是编写一个程序,生成一个由随机生成的二进制数组成的 8 x 8 矩阵,并让程序检查哪些列(如果有)全为 0,以及主对角线和次对角线是否也由零组成。主对
我正在尝试编写一个由任意数量的 lambda 函数组成的函数。 我有两个简单的 lambda 函数。 f = lambda x: x + 1 g = lambda x: x**2 我对组合函数的尝试是
我在这里学习 Docker Compose 教程 https://docs.docker.com/get-started/part5/#recap-optional version: "3" serv
我正处于要为应用程序编写 androidTests 的状态。 阅读 Testing Compose 的文档,我创建了一个文件并编写了一个简单的测试来检查进度: ExamineTest.kt: clas
我最近刚跨过木偶继承。围绕它的几个问题: 使用p继承是一种好习惯吗?一些经验丰富的木偶同事告诉我,木偶的继承不是很好,我不太相信。 来自OO世界,我真的很想了解木偶继承的原理,以及覆盖的原理。 最佳答
我正在尝试使用 docker-compose 创建一个基本网页 这是我的 yml 文件 identidock: build: . ports: - "5000:5000" envir
我们有docker-compose.yml,其中包含Kafka,zookeeper和schema registry的配置 当我们启动docker compose时,出现以下错误 docker-comp
我在玩 Haskell 的类型时无意中发现了 length 。总和 有效。是否有一些语义应该允许它工作,或者这仅仅是类型定义的一个缺点?我在下面编写了每个类型定义。 length :: Foldabl
如何防止缩小仅包含 JFormattedTextFields 的 JPanel。 JFormattedTextField textF1; JFormattedTextField textF2;
我尝试更 retrofit 载我的 Docker 卷的用户,但执行此操作的是“root”用户,而不是“安全用户”。知道如果我在 Dockerfile 中执行“chown -R/var/www”,这将不
我正在尝试将 scalaz 的 ioeffect IO[E,A] monad 用于一段非常有效的代码。 我试图用 IO[E,A] 在高层次上重写的代码需要一些关于存储在云中的文件的元数据。代码试图:
这个问题已经有答案了: What special characters must be escaped in regular expressions? (13 个回答) 已关闭 5 年前。 java中
我是一名优秀的程序员,十分优秀!