文档和修订版是两个驻留在我们的域逻辑特定层中的对象 .
文档代表了你能想到的任何材料纸的抽象 . 也就是说 - 每份 Contract ,发票或图纸都可以称为文件 .
另一方面,文档的材料表示是修订:建筑工程师在现场接收的纸张列表表示设计者创建的文档的修订版 . 如果由于错误或需求更改而必须更改图形中的某些内容,则会在现场显示新修订 - 同一文档的修订版#2 .
修订版可能包含其他文件的链接;因此,我们可以描述汽车,车门,发动机,车轮等之间的关系,以及每个元素独立演变的可能性,同时保持与其他元素的联系 .
显示典型的DAG:
我设法使用C# Graph API将所有顶点和边缘插入到CosmosDB中 . 我设法遍历图表并执行简单查询,以便查找汽车有多少修订,或者发动机在最初创建时是否有涡轮增压器 . 但是,我正在努力编写一个复杂的查询,它只返回每个部分或汽车的最新版本,或者返回到2016-08-10的汽车状态的查询 .
该车的状态截至2017-01-03:
该车的状态可达2016-08-10:
当遍历访问顶点的后代(其“out()”)时,我找不到一种方法来获取最近创建的并继续遍历而不挖掘其他顶点 . 如果你建议我一个表达式,我只会从图片中返回彩色顶点,我将不胜感激 .
1 回答
虽然图片很有用,但在询问有关Gremlin的问题时,始终提供可生成图表样本的Gremlin脚本会很有帮助 . 例如,对于您的问题:
回答问题的人通常需要更多时间来为问题创建示例图,而不是开发提供答案的Gremlin .
无论如何,这是使用“8/10/2016”作为“开始日期”的一种方法:
这是一个不同日期的相同遍历 - “1/1/2017”:
在这种情况下,请注意“引擎版本3”被排除,因为它是“1/1/2017”之后的唯一顶点 - 树的其余部分存在 .
几点说明:
我将您的日期转换为多头以便于比较 . 我不确定CosmosDB是否对
has()
的lte
谓词的日期处理得很好,但如果确实如此,你可能更愿意选择那条路线 .repeat()
步允许在树中进行任意深度遍历,但请注意它在emit()
之后包含的重复逻辑 - 这将抓取最终"leaves of the tree",因为没有更多的outE()
遍历repeat()
循环结束 .repeat()
中的逻辑看起来有点复杂,但它基本上只是说当前"document"遍历所有"revisions",按日期降序排序并 grab 第一个 . 一旦它具有由您关注的日期控制的最新修订,则遍历其连接的任何其他文档 .我在这种情况下使用了
tree()
步骤,因为CosmosDB似乎支持这一点 . 它看起来并不像是支持subgraph()
. Apache TinkerPop C#Gremlin语言变体在技术上甚至不支持这一步骤 - 那里存在一些挑战,遗漏了Java唯一的功能 . 幸运的是,数据的形状是树状的,所以tree()
步骤似乎已经足够了 .在Groovy中,您可以通过闭包来提供重复的逻辑,以使事情更加可重用:
或者存储'traverseAndFilter'遍历本身和
clone()
它: