- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在阅读 The Practitioner's Guide to Graph Data 并试图解决以下问题(仅用于学习目的)。以下是书籍电影数据集的上下文,在此示例中,它使用了一个“标签”顶点、一个“电影”顶点和一个“评级”边,其评级属性值为 1-5 。
只是为了练习,并为了扩展我对书中概念的理解,我想将所有电影都标记为“喜剧”并计算平均 NPS。为此,我想将所有正面 (+1) 和中性或负面 (-1) 评级汇总到一个列表中。然后我希望将这些值的总和除以该列表中的变量数量(平均值)。这就是我的尝试:
dev.withSack{[]}{it.clone()}. // create a sack with an empty list that clones when split
V().has('Tag', 'tag_name', 'comedy').
in('topic_tagged').as('film'). // walk to movies tagged as comedy
inE('rated'). // walk to the rated edges
choose(values('rating').is(gte(3.0)),
sack(addAll).by(constant([1.0])),
sack(addAll).by(constant([-1.0]))). // add a value or 1 or -1 to this movies list, depending on the rating
group().
by(select('film').values('movie_title')).
by(project('a', 'b').
by(sack().unfold().sum()). // add all values from the list
by(sack().unfold().count()). // Count the values in the list
math('a / b')).
order(local).
by(values, desc)
最后每部电影要么是“1.0”要么是“-1.0”。
"Journey of August King The (1995)": "1.0",
"Once Upon a Time... When We Were Colored (1995)": "1.0", ...
在我的测试中,这些值似乎没有按照我的预期聚合到集合中。我尝试了各种方法,但都没有达到我的预期结果。
我知道我可以通过在初始值为“0.0”的麻袋中加减,然后除以边数来实现这个结果,但我希望通过使用列表并避免使用更有效的解决方案额外遍历边缘以获得计数。
是否可以使用列表来实现我的结果?如果是,怎么办?
编辑 1:
下面的代码更简单,取自 Kelvins 示例,将通过简单地使用折叠步骤来汇总每个评分:
dev.V().
has('Tag', 'tag_name', 'comedy').
in('topic_tagged').
project('movie', 'result').
by('movie_title').
by(inE('rated').
choose(values('rating').is(gte(3.0)),
constant(1.0),
constant(-1.0)).
fold()) // replace fold() with mean() to calculate the mean, or do something with the collection
我有点尴尬,因为折叠和展开太常见了,我完全忘记了折叠步骤。我猜想多了。
最佳答案
您可能会考虑使用 aggregate
而不是 sack
的不同方法。您还可以使用 mean
步骤来避免需要 math
步骤。由于我没有您的数据,因此我做了一个示例,该示例使用航线数据集并使用机场海拔高度而不是您案例中的电影评级。
gremlin> g.V().hasLabel('airport').limit(10).values('elev')
==>1026
==>151
==>542
==>599
==>19
==>143
==>14
==>607
==>64
==>313
使用与您的 yield 类似的加权系统
gremlin> g.V().hasLabel('airport').limit(10).
......1> choose(values('elev').is(gt(500)),
......2> constant(1),
......3> constant(-1))
==>1
==>-1
==>1
==>1
==>-1
==>-1
==>-1
==>1
==>-1
==>-1
这些结果可以聚合成一个批量集
gremlin> g.V().hasLabel('airport').limit(10).
......1> choose(values('elev').is(gt(500)),
......2> constant(1),
......3> constant(-1)).
......4> aggregate('x').
......5> cap('x')
==>[1,1,1,1,-1,-1,-1,-1,-1,-1]
从那里我们可以取平均值
gremlin> g.V().hasLabel('airport').limit(10).
......1> choose(values('elev').is(gt(500)),
......2> constant(1),
......3> constant(-1)).
......4> aggregate('x').
......5> cap('x').
......6> unfold().
......7> mean()
==>-0.2
现在,这当然是人为设计的,因为您通常不会执行 aggregate('x').cap('x').unfold().mean()
您只会使用 mean()
本身。但是使用这种模式你应该能够解决你的问题。
编辑添加
仔细考虑一下,您甚至可以在不需要 aggregate
的情况下编写查询 - 如下所示。我使用航线距离边缘属性来模拟类似于您的查询的内容。该示例仅使用一个机场以保持简单。首先只是创建分数列表...
gremlin> g.V().has('airport','code','SAF').
......1> project('airport','mean').
......2> by('code').
......3> by(outE().
......4> choose(values('dist').is(gt(350)),
......5> constant(1),
......6> constant(-1)).
......7> fold())
==>[airport:SAF,mean:[1,1,1,-1]]
最后创造平均值
gremlin> g.V().has('airport','code','SAF').
......1> project('airport','mean').
......2> by('code').
......3> by(outE().
......4> choose(values('dist').is(gt(350)),
......5> constant(1),
......6> constant(-1)).
......7> mean())
==>[airport:SAF,mean:0.5]
再次编辑
如果边缘属性可能不存在,你可以这样做......
gremlin> g.V().has('airport','code','SAF').
......1> project('airport','mean').
......2> by('code').
......3> by(outE().
......4> coalesce(values('x'),constant(100)).
......5> choose(identity().is(gt(350)),
......6> constant(1),
......7> constant(-1)).
......8> fold())
==>[airport:SAF,mean:[-1,-1,-1,-1]]
关于cassandra - Tinkerpop Gremlin - 如何将变量聚合到遍历独立集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63843563/
我想使用Java API来操作远程服务器上的图形,该服务器实际上位于localhost中。我用来连接服务器的代码是: JanusGraphFactory.Builder b = JanusGraphF
我的数据结构如下: { number: Integer letter: String } 我想像这样按两个属性进行分组计数: g.V().values('number', 'lette
我目前正在使用 TinkerPop Java API 进行图形遍历。目前我必须创建相同遍历的副本来计算计数。 Long allUsersCount = gt.V().hasLabel("user").
示例数据:TinkerPop Modern Graph 条件: vadas 是否在 2 跳内连接到 lop vadas 是否在 3 跳内连接到 peter vadas 是否在 1 跳 中连接到 doe
我研究 Tinkerpop 堆栈已有一段时间了。我想我很清楚它能做什么以及它适用于哪些数据库。我现在正在考虑几个不同的数据库,但还没有确定。所以我决定只为接口(interface)编写代码,现在不考虑
如果不遍历整个事物,我似乎无法在图中找到特定节点。有什么我想念的吗? 我正在使用 tinkerpop 蓝图。 Orientdb 为诸如“#8:1”之类的节点提供了某种无意义的 id - 我如何在不知道
给定一个树形结构的 TinkerPop 图,其顶点通过标记的父子关系 ([parent-PARENT_CHILD->child]) 连接,遍历并查找所有这些节点的惯用方法是什么? 我是图形遍历的新手,
我想匹配所有 b1,其中不存在节点 b2 ,如下所示。 这是某种 2 跳不对称性。请注意,不存在 b2 必须链接到与 b1 相同的 c:C,因此其他 >(a2) --> (b3) --> (a1) 可
有没有办法在创建顶点后设置T.label。我尝试了以下方法: Vertex v = graph.addVertex(); v.property(T.label.name(), "test"); 但是当
我是 Gremlin 的新手,我需要帮助来设置最佳查询以选择唯一和过滤的结果。 从一个 team 开始,我会得到每个 的 player (注意:每个玩家可以为多个团队效力)由 is_friends_w
我正在尝试遍历图形以追踪特定节点的沿袭。我希望我的查询以广度优先模式生成该节点的前因。注意,每个节点可以有多个父节点。该图可以有很多层,我想查看给定节点的所有级别的结果。我正在尝试跟进 this配方,
总结 我正在开发一个应用程序,该应用程序旨在跨 tinkerpop 支持的多个图形数据库工作 详情 根据我的研究,相同版本的 tinkerpop 库(gremlin-python)不适用于所有图形数据
执行以下遍历时: graph.addVertex("a") graph.addVertex("b") graph.addVertex("c") graph.traversal().V().range(
当我查询路径时,例如: g.V(1).inE().outV().inE().outV().inE().outV().path() path()中既有顶点也有边,请问有没有办法只计算路径中的顶点数而忽略
我目前正在阅读 The Practitioner's Guide to Graph Data 并试图解决以下问题(仅用于学习目的)。以下是书籍电影数据集的上下文,在此示例中,它使用了一个“标签”顶点、
我有一个非常简单的示例图,我正在尝试对其进行深度优先查询。假设图形边缘如下所示 A->B A->C B->D B->E C->F C->G 从 A 开始的深度优先搜索应该返回 A-B-D-E-C-F-
例如,给定这张图: gremlin> graph = TinkerFactory.createModern() (1) ==>tinkergraph[vertices:6 edges:6] greml
我第一次使用 Frames,但我的 Java 已经很生疏了。我坚持通过框架将信息写入数据库。我一直在关注文档并拥有一个 Person 界面。 public interface Person { @
给定一组 User 顶点,我需要找到连接到这些顶点的所有 Chat 顶点,但没有其他顶点。例如,只有 Alice 和 Bob 参与的所有聊天。查询应对结果进行排序,以便首先返回连接到最新消息的聊天。
我的 Java 应用程序中有一个图形遍历,在遍历完成后需要 300 毫秒以上才能填充路径对象。这很奇怪,因为它只发生在某些特定的遍历上,而其他遍历会立即填充它们的路径。以下是 Java 代码示例,使用
我是一名优秀的程序员,十分优秀!