科学探索网
  • 首页
  • 科学研究
  • 科技创新
  • 科普知识
  • 科学家故事
  • 让建站和SEO变得简单

    让不懂建站的用户快速建站,让会建站的提高建站效率!

    科技创新

    读图数据库实战条记08遍历与子图

    发布日期:2024-12-25 00:48    点击次数:86

    1. 使用熟路构建遍历

    1.1. 为了幸免把拓荒遍历和构建应用按序浑浊

    1.1.1. 把遍历的编写和测试与应用按序的拓荒拆分红了两个独处的操作1.1.2. 在Java代码之外独处拓荒遍历,然后把它们加入应用按序中1.1.3. 施行情况是,大多数拓荒东说念主员会同期完成两者,不论使用的是哪种数据库引擎

    1.2. 拓荒熟路遍历要识别模式的相关部分,寻找遍历的早先和尽头,识别从早先到尽头遍历所需的一系列绝顶和边,临了循序渐进、迭代式地加多操作来构成遍历,并通过测试数据考据每一步的恶果

    1.3. 好的遍历早先不错最小化运转绝顶,最空想的情况是唯唯一个绝顶

    2. 拓荒遍历的准备职责

    2.1. 用例的需求

    2.1.1. 为用例拓荒遍历要从识别修起业务疑问所需的绝顶和边运转

    2.2. 图数据模子

    2.3. 在把业务疑问维持为技能需求与收场时,代词很容易被忽略,这会隐敝荒谬的、更幽微的需求

    2.4. 识别所需的元素

    2.4.1. 检视每一个需求,并将其拆分红修起该疑问所需的组件2.4.2. 识别所需的绝顶标签2.4.2.1. 最好的早先即是寻找需求中的名词2.4.2.2. 在数据模子中寻找这些名词对应的绝顶标签2.4.2.3. 定位早先是为了寻找和疑问相关的部分,从而把遍历削弱到数目最少的运转绝顶2.4.3. 识别所需的边标签2.4.3.1. 一朝识别了需求中的动词,就不错查找数据模子中相应的边名了,就像找名词那样

    2.5. 选拔早先

    2.5.1. 选拔咱们以为最具挑战性的问题,并从它脱手2.5.1.1. 这个方式相宜有大皆未知成分或大皆款式风险的情况2.5.1.1.1. 向拓荒生态系统引入新技能或新经由2.5.1.2. 这个方式能让咱们快速失败,亦然需要快速决策时的正确选拔2.5.1.2.1. 需要决定是否延续2.5.1.2.2. 细则某项技能是否是处置某个问题的正确选拔2.5.2. 从最凯旋或最不复杂的疑问运转,并以此行为之后职责的基石2.5.2.1. 这条说念路倡导代码的渐进式拓荒,也很好地幸免了囫囵吞枣2.5.2.2. 该方式的真理在于快速获取得手,梗概在处理更复杂的问题之前,从更小、更肤浅的问题中得回成就感2.5.2.3. 从最不复杂的疑问运转,咱们就能在处置更复杂的问题之前从更小、更肤浅的问题何处获得回手

    2.6. 准备测试数据

    2.6.1. 加载测试数据2.6.2. 在对数据有不实假定的其他情景中,加多样本数据可能是最好方式2.6.3. 在排查此类不实的期间,你手上还有其他资源2.6.3.1. 和共事研究问题能匡助你得回处置有打算2.6.3.2. 另一种可行的方式是尝试以更受控的方式复制酌量要求,也许是使用更小的数据集2.6.4. 秉承一步接一步的系统性方式构建遍历不错使遭受不及时的排查变得更容易

    3. 编写第一个遍历

    3.1. 假想遍历

    3.1.1. 布丁好不好,吃过才知说念

    3.2. 拓荒遍历代码

    3.2.1. 在Gremlin Server里,日历是以宇宙合营时(Coordinated Universal Time,UTC)的方式保存的3.2.1.1. 为了裸露,Gremlin Console会自动将其维持资腹地时区的日历3.2.2. 通过ID推广遍历3.2.3. 拓荒熟路遍历所需的功夫如实比拓荒酬酢蓄积需要的多,但最珍惜的任务照旧完成了3.2.4. mean():团聚一组值来计较平均值,常用与group().by().by()操作搭配使用3.2.5. has()操作是弘大的筛选操作,亦然基于属性收场筛选逻辑的首选3.2.6. where()操作时常用于其他情况的筛选——基于比肤浅属性匹配更复杂的逻辑组合的筛选3.2.7. identity():获取插足该操作的元素并陈陈相因地复返3.2.8. optional(traversal):尝试遍历,要是复返恶果,则发出恶果;不然,发出传入元素(与identity()操作相通)3.2.9. lues标志和values()操作是不相通的3.2.9.1. values标志指向键-值对的值部分3.2.9.2. values()指定从元素中复返的属性

    3.3. 对遍历进行分组和排序会创建键-值对神志的恶果

    3.3.1. 对键-值对的进一步处管待秉承select()操作的一个特殊重载,远离对键-值对中键的部分和值的部分进行处理

    3.4. 在遍历过程中越早进行筛选,意味着在图中迁移的遍历器越少,因此要作念的总体职责也越少

    4. 分页和图数据库

    4.1. offset(偏移值)

    4.1.1. 要跳过的纪录数目4.1.2. 在数据集的早先,offset =04.1.3. 偏移值是分页大小的倍数4.1.3.1. 要是分页大小是10,偏移值则可能是0、10、20、30等

    4.2. limit(终局值)

    4.2.1. 分页大小或要复返项的最大数目4.2.2. 终局值是要复返项的最大数目,是因为恶果集并不老是分页大小4.2.2.1. 临了一页所含的项比分页大小要少

    4.3. range(startNumber, endNumber)

    4.3.1. 穿过各个对象,从startNumber运转(包含该索引位置的对象),直到endNumber(不包含该索引位置的对象)4.3.2. startNumber是包含在复返恶果中的4.3.2.1. startNumber和offset相通4.3.3. endNumber被搁置在复返恶果除外4.3.3.1. endNumber则不是关所有这个词据库中使用的limit,而是startNumber +limit4.3.3.2. 分页功能要以offset和limit行为通例输入,计较endNumber4.3.4. 调用range()前为输入排序的伏击性4.3.4.1. 数据库引擎基于其里面逻辑决定恶果的法例4.3.4.2. 要给用户提供一致的体验,就必须在调用range()操作前进行排序4.3.5. 排序是欣喜的操作4.3.5.1. 对恶果进行排序在职何数据库中皆是欣喜的操作,非凡是关于大型数据集来说4.3.5.2. 键-值对很容易使用,前提是能以它们的值来排序

    4.4. 在关所有这个词据库中处理分页的通用模式和在图数据库里是相通的

    4.4.1. 获取遍历的恶果4.4.2. 找到offset索引指定的纪录4.4.3. 复返恶果的limit数4.4.4. 字据新的偏移值offset + limit叠加以上过程

    4.5. 方式1是一直运行遍历,递加offset,直到它复返空的恶果集为止

    4.5.1. 稳健的场景是:预期的恶果数目很大,并且不需要知说念总和;梗概想幸免提前为所有这个词恶果计数的支拨

    4.6. 方式2是预设可能的恶果总和,并把它行为offset + limit值的上限

    4.6.1. 关于应用按序需要知说念裸露恶果总和的场景非凡有用

    4.7. 在图遍历中对恶果进行分页需要以排序后的恶果集行为输入,并行使终局值和偏移值指按盼望的恶果子集

    5. 五个通用操作

    5.1. general step

    5.2. map、flatMap、filter、branch、sideEffect

    5.2.1. 这五个通用操作是编程的中枢倡导

    5.3. 所有这个词的Gremlin操作,除了调整或建树其他操作的操作之外,骨子上皆是这五个通用操作之一的优化版块

    6. 子图

    6.1. 个性化是基于数据中的结伙关系筛选数据以提供最酌量内容的过程

    6.1.1. 只专注于数据的一个子集,而忽略另一个子集6.1.2. 子图自然相宜个性化问题

    6.2. 因为只就图中明确界说的部分数据提倡疑问,是以咱们只想处理这个数据子集

    6.2.1. 作念到这少量的最灵验按序是从全局图中索要该数据子集6.2.2. 这是一个常见的操作,该数据子集称为子图6.2.3. 即是绝顶和边的子集,时常字据某种划定或对业务限制的归拢而精采连系

    6.3. 子图是图数据的子集,包含用来暗示图的绝顶和边

    6.3.1. 子图本人即是图6.3.2. 意味着咱们不错在子图上运行遍历,然则因为子图被终局在一小部分绝顶和边上,是以只需要更少的内存和计较才能

    7. 使用子图

    7.1. 并不是所有这个词的图数据库居品皆有显式的子图撑握

    7.2. 子图亦然图,仅仅其中的所有这个词绝顶和边皆是一个更大的图的子集

    7.2.1. 子图本人即是一张图的事实是子图如斯有用的原因之一:它们的职责旨趣与更大的图相通,但内存占用更少7.2.2. 子图是以图的神志复返的,是以一朝为子图创建了图遍历源,就不错遍历这些子图并奉行你学到的所有这个词操作

    7.3. 索要子图

    7.3.1. 按绝顶归纳子图是通过一组绝顶偏激之间的边来界说的7.3.1.1. 按绝顶归纳子图包括绝顶之间的所有这个词边7.3.2. 按边归纳子图是通过一组边偏激相邻绝顶来界说的7.3.2.1. 按边归纳子图只包括那些被界说的边7.3.2.2. 使用边来界说规模似乎有违直观7.3.2.2.1. 从历史上看,咱们在斟酌数据时老是抱着一种实体第一(以致是实体唯一)的想维方式7.3.2.3. 图的实体关系允许咱们使用边行为“一等公民”来界说子图的适度7.3.2.4. Gremlin Server的TinkerPop收场撑握按边归纳子图,因此按边归纳子图将是个性化用例的要点7.3.3. 两种按序的恶果并非老是不同7.3.3.1. 子图的构成取决于你使用的按序以及在选拔过程中使用的划定7.3.4. subgraph(sideEffectKey):在一组较大的图数据中界说一个按边归纳子图7.3.4.1. sideEffectKey是对反作用完满恶果的援用7.3.4.2. 反作用是咱们改换情状的方式7.3.4.3. subgraph()操作的主要作用是复返行为其输入的边7.3.4.4. 该操作的反作用部分将这些沟通的边偏激相邻绝顶添加到了由标签标志的里面聚合中7.3.4.5. TinkerPop的subgraph()操作有一个要害的终局:Gremlin话语变体(GLV)不撑握它7.3.4.5.1. GLV莫得包括局部图的倡导,这意味着咱们不行复返子图,然后将其用于进一步的遍历7.3.4.5.2. GLV不撑握子图,因此必须使用剧本提交按序来参数化并拼接字符串以编写遍历7.3.4.6. subgraph变量只存在于会话中的职业器上7.3.5. cap(sideEffectKey):进取迭代遍历到自身,并发出sideEffectKey援用的反作用恶果

    7.4. 遍历子图

    7.4.1. Graph是一个数据存储7.4.1.1. 仅仅存放数据的方位,除了最肤浅的查找操作除外,莫得探问数据的其他才能7.4.2. GraphTraversalSource是编写所有这个词遍历的基础(遍历中的g)7.4.2.1. 莫得GraphTraversalSource的图对象就相配于莫得任何类型文献料理器的文献系统偏激文献7.4.2.2. 莫得任何类型的器具来导航文献系统、读取文献偏激属性梗概迁移文献7.4.2.2.1. 在使用子图之前,需要得回遍历源

    7.5. 将子图用于串行间隔

    7.5.1. 不错将其视为使用可序列化间隔模式与图数据交互的方式7.5.2. 子图是在图数据库中设立可序列化间隔的一种无奈方式7.5.3. 子图是莫得磁盘缓存功能的内存结构,因此创建所有这个词这个词原始图的子图可能会酿成内存压力,以致会激发内存不及不实7.5.4. 字据可串行间隔的界说,子图中发生的任何变化皆不会反应在原始图中,反之亦然7.5.4.1. 要依靠应用按序拓荒东说念主员来合营两者之间的变化7.5.5. 子图不错被复用以致修改,但所作念的任何更始皆是与原始图间隔的7.5.5.1. 意味着任何更始皆不会传回原始图数据

    7.6. 遍历末尾还包含了文本; null

    7.6.1. 分号(;)用于终局第一个语句,即子图变量的赋值7.6.2. null用于将所有这个词这个词操作复返给客户端

    8. 回转遍历标的

    8.1. 在大多数关所有这个词据库建模中,非凡是使用第三范式时,外键被假想为只在一个方进取使用

    8.1.1. 要是要撑握相悖标的的结伙,时常代价很高

    8.2. 关于大多数图数据库来说,撑握相悖标的的结伙不会产生荒谬的性能资本

    8.3. 在关所有这个词据库宇宙中,肤浅地改换关系的标的险些是绝世超伦的,但关于图数据库来说,这险些是一个微不及说念的变化



    Powered by 科学探索网 @2013-2022 RSS地图 HTML地图

    Copyright Powered by365建站 © 2013-2024