gremlin查询:根据属性值进行排序和选择

时间:2019-07-17 09:35:55

标签: python graph-databases gremlin graph-traversal

对于this模式,我需要找到那些在上一个x中接听了program个呼叫的用户。

这意味着我需要:

1)根据日期对program节点进行排序

2)选择日期最近的program

3)从x下的先前列出的picked==yes节点的短集合中选择具有call的边数为program的用户。 (注意:日期不过是存储为字符串的13位长的unix时间戳)

到目前为止,我的尝试:

以下是我尝试查找在所有程序中选择x(例如2)次呼叫的用户列表的查询:

g.V().hasLabel("user").filter(inE().has("picked","yes").count().is(eq(2))).values("name")

使用filter(),我们可以进一步对给定程序abc执行相同的查询(不确定这在计算上是否有效):

g.V().hasLabel("User").filter(inE().has("picked","yes").filter(outV().in().has("program","name", "abc")).count().is(eq(2)))

我知道如何根据{'1Date}(开始日期)属性对program节点进行排序:

g.V().hasLabel("program").order().by("sDate", asc).values("name")

从对gremlin众多功能的有限了解中,我可以理解,我需要找到一种将这些查询包括在内以满足我的要求的方法,但是到目前为止,所有尝试都没有成功。

有什么方法可以执行此查询?

如果有兴趣处理示例数据:

要生成要使用的示例,我使用networkx库(以及用于伪造数据的fakerr库)编写了一个python program,以制作图形,然后将其导出到graphml equivalent,以导入到gremlin 。随时复制程序以重新创建方案。我建议您尝试使用以下方法直接导入提供的graphml代码以尝试查询:

graph = TinkerGraph.open()
g = graph.traversal()
graph.io(graphml()).readGraph("/path/to/file/schema.graphml")

(注意:由于未知的原因(也许值得问另一个问题),如果您尝试直接将导出的graphml代码导入gremlin,则所有标签都将被识别为Vertex / Edge(不是用户/程序等)。要解决此问题,我必须用labelVlabelE替换(在graphml代码中)标识符(例如:d1,d6),之后它才能起作用。对此奇怪的现象进行解释(如果有的话,欢迎使用)< / p>

0 个答案:

没有答案