标签: gremlin

如何在 gremlin 中返回 true 或 false

我想将 a 周围的边数与数字进行比较并打印trueor false,类似这样: g.V().out().count()==0==在这里不起作用,它总是返回false。还有其他方法吗?

gremlin

5
推荐指数
1
解决办法
1996
查看次数

普通 JSON 转 GraphSON 格式

我有两个问题:

  1. 我在哪里可以找到 GraphSON 文件的基本格式,保证 gremlin 控制台成功加载?我正在尝试将 JSON(大约有 10-20 个字段)转换为另一个可以由 gremlin 查询的文件,但我实际上无法找到有关 graphson 格式保留的字段的任何相关信息,或者我应该如何处理 ID等等。我导出了他们提供的现代图形,它甚至不是一个有效的 JSON(多个 JSON 根元素),而是一个 JSON 列表 [1] 我还看到了像 outE、inE 这样的字段...创建?

  2. 如果我能够创建 JSON,那么在我启动它时,我应该在哪里告诉服务器将它加载为基础图?在配置文件中还是在脚本中?

谢谢!阿德里安

[1] https://pastebin.com/drwXhg5k

{"id":1,"label":"person","outE":{"created":[{"id":9,"inV":3,"properties":{"weight":0.4}}],"knows":[{"id":7,"inV":2,"properties":{"weight":0.5}},{"id":8,"inV":4,"properties":{"weight":1.0}}]},"properties":{"name":[{"id":0,"value":"marko"}],"age":[{"id":1,"value":29}]}}
{"id":2,"label":"person","inE":{"knows":[{"id":7,"outV":1,"properties":{"weight":0.5}}]},"properties":{"name":[{"id":2,"value":"vadas"}],"age":[{"id":3,"value":27}]}}
{"id":3,"label":"software","inE":{"created":[{"id":9,"outV":1,"properties":{"weight":0.4}},{"id":11,"outV":4,"properties":{"weight":0.4}},{"id":12,"outV":6,"properties":{"weight":0.2}}]},"properties":{"name":[{"id":4,"value":"lop"}],"lang":[{"id":5,"value":"java"}]}}
{"id":4,"label":"person","inE":{"knows":[{"id":8,"outV":1,"properties":{"weight":1.0}}]},"outE":{"created":[{"id":10,"inV":5,"properties":{"weight":1.0}},{"id":11,"inV":3,"properties":{"weight":0.4}}]},"properties":{"name":[{"id":6,"value":"josh"}],"age":[{"id":7,"value":32}]}}
{"id":5,"label":"software","inE":{"created":[{"id":10,"outV":4,"properties":{"weight":1.0}}]},"properties":{"name":[{"id":8,"value":"ripple"}],"lang":[{"id":9,"value":"java"}]}}
{"id":6,"label":"person","outE":{"created":[{"id":12,"inV":3,"properties":{"weight":0.2}}]},"properties":{"name":[{"id":10,"value":"peter"}],"age":[{"id":11,"value":35}]}}
Run Code Online (Sandbox Code Playgroud)

javascript json gremlin gremlin-server graphson

5
推荐指数
1
解决办法
3846
查看次数

CosmosDB 创建 - API 选项(SQL 与 Graph)

我对使用Azure CosmosDB的图形功能很感兴趣。查看文档,我看到它将图形顶点和边作为 JSON 文档(具有商定的架构)进行处理,因此可以作为普通的旧 DocumentDB 访问它。

考虑到这一点,您在创建新实例(链接)时需要进行的API选择的含义是什么?

例如:

  • 如果我将数据库创建为SQL (DocumentDB) 并通过客户端的图形部分(例如 CreateGremlinQuery)操作数据,我会失去什么
  • 如果我将数据库创建为图形并通过客户端的 DocumentDB 部分(例如 CreateDocumentAsync)操作数据,我会失去什么

更新:我知道门户差异(如下所述Jesse Carter)。我感兴趣的是,在 SQL(Document DB) 与 Graph 之间进行选择的特定场景中,此开关是否会驱动其他任何内容

gremlin azure-cosmosdb

5
推荐指数
1
解决办法
455
查看次数

Cosmos DB 图边缘分区

Cosmos DB 已预先宣布 Gremlin(图形 API)的全面可用性。可能到 2017 年底它会退出预览版,因此我们可能认为它足够稳定以进行生产。这让我想到以下几点:

我们正在设计一个估计用户群高达 1 亿用户的系统。每个用户在 Cosmos 中都会有一些文档来存储用户相关的数据,这些文档根据用户的 id(一个 Guid)进行分区。因此,当估计成真时,我们最终会得到至少 1 亿个分区,每个分区都包含一堆文档。

我们不仅会存储与用户相关的数据,还会存储用户之间的相关数据(关系)。从理论上讲,Cosmos 应该非常适合这些类型的场景,将它与文档 API 跨 API 用于普通数据,将 Graph API 用于纯粹的关系。

这些关系之一的示例是关注。例如UserX可以 Follow UserY。为了实现这种关系,我们创建了一个 Gremlin 查询,它创建了一个Edge

    g.V().hasId('{userX.Id}').has('pkey','{userX.Partition}')
    .addE('follow').to(g.V().hasId('{userY.Id}').has('pkey','{userY.Partition}'))
Run Code Online (Sandbox Code Playgroud)

结果会Edge自动分配给 的分区UserX,因为UserX是出顶点。

在传出边缘(所有UserX跟随的用户)上查询时,一切都很好,因为查询仅限于UserX.

    g.V().hasId('{userX.Id}').has('pkey','{userX.Partition}').outE('follow').inV()
Run Code Online (Sandbox Code Playgroud)

但是,当反转查询(查找 的所有关注者UserY),寻找传入的边时,情况会发生变化 - 据我所知,这将导致完整的跨分区查询:

    g.V().hasId('{userY.Id}').has('pkey','{userY.Partition}').inE('follow').outV()
Run Code Online (Sandbox Code Playgroud)

在我看来,具有 1 亿个分区的完整跨分区查询是不可接受的。

我曾尝试将其内部和Edge之间放入自己的分区,但 Graph API 不允许我这样做。(编辑:将 Cosmos 更改为 Graph APIUserXUserY

现在我已经到了在UserX和之间实现一对边的地步UserY,一个传出 …

graph azure gremlin azure-cosmosdb

5
推荐指数
1
解决办法
811
查看次数

如何在 Gremlin 中使用 UUID 作为 id?

我正在添加这样的顶点:

g.addV("foobar").property("id", 1).property(...etc...

如何使用 uuid 而不是整数 id 设置属性?

gremlin tinkerpop gremlin-server

5
推荐指数
1
解决办法
3485
查看次数

使用特定模型通过 Tinkerpop 将(数百万行)数据导入 Janusgraph 的最佳方法

刚开始使用 Tinkerpop 和 Janusgraph,我正试图根据文档弄清楚这一点。

  • 我有三个数据集,每个数据集包含大约 2000 万行(csv 文件)
  • 有一个特定的模型,其中变量和行需要连接,例如什么是顶点,什么是标签,什么是边等。
  • 在图表中包含所有内容后,我当然想使用一些基本的 Gremlin 来查看模型的工作情况。

但首先我需要一种将数据导入 Janusgraph 的方法。

可能存在用于此的脚本。但除此之外,它是否可能用python编写,打开一个csv文件,获取变量X的每一行,并将其添加为顶点/边/等。……?还是我完全误解了 Janusgraph/Tinkerpop?

提前感谢您的任何帮助。

编辑:

假设我有几个文件,每个文件包含几百万行,代表人,还有几个变量,代表不同的指标。第一个示例可能如下所示:

             metric_1    metric_2    metric_3    ..

person_1        a           e           i
person_2        b           f           j
person_3        c           g           k
person_4        d           h           l
..        
Run Code Online (Sandbox Code Playgroud)

我是否应该将其转换为具有首先仅由值 [a,..., l] 组成的节点的文件。(以及后来可能更精细的属性集)

然后 [a,..., l] 被索引了吗?

在“现代”图形这里似乎有一个索引(号码1,...,12对所有的节点和边,独立于它们的重叠标签/类别的),例如应在每次测量单独索引,然后连接至一个给定的person_x他们属于哪个?

为这些可能直截了当的问题道歉,但我对此很陌生。

python gremlin tinkerpop tinkerpop3 janusgraph

5
推荐指数
2
解决办法
2684
查看次数

Tinkerpop & Python - 通过 gremlin 设置数组属性

我将 JanusGraph 与标准 python gremlin 绑定一起使用,我想float[]在顶点/边上设置一个属性。但是,PythonTinkerpop 驱动程序似乎无法做到这一点。

例如,下面是一个直接在 Groovy 中运行的脚本示例:

val = [1.2, 3.4, 5.6]
_client.submit("g.V(4200).property('a', %s as float[])" % val).all().result()
Run Code Online (Sandbox Code Playgroud)

这是使用 gremlin python 库时失败的代码:

val = [1.2, 3.4, 5.6]
g.V(4200).property('a', val).next()
Run Code Online (Sandbox Code Playgroud)

错误在哪里:

GremlinServerError: 500: Property value [[1.2, 3.4, 5.6]] is of type class java.util.ArrayList is not supported
Run Code Online (Sandbox Code Playgroud)

该错误可能是因为请求是由 python 驱动程序在 GraphSON 中序列化的 - 并且 GraphSON 支持具有不同类型元素的数组,因此场景背后的 Java 代码将值读取为 a java.util.ArrayList,而实际上无法转换为float[].

问题是 - 除了编写显式查询字符串之外,是否有任何理智的方法可以做到这一点?

python gremlin tinkerpop tinkerpop3 janusgraph

5
推荐指数
1
解决办法
991
查看次数

如何处理具有大量边的顶点?

在我们的图中,有很多顶点的输出边超过 100k。我想知道处理由此产生的所有情况的方法是什么。

假设我们group_1在图中定义了一个。group_1有 100k members。我们有一些从member_x顶点开始的遍历并计算一些东西。这些遍历非常快,每次都在大约 2 秒内结束。

但是时代变了,现在我们需要将单个小遍历的所有结果汇总为一个数字。遍历必须包含来自group_1's 成员的所有结果。

最初,我们的方法是创建其发射一束遍历members_x通过使用skiplimit,然后,在应用层上采用并行处理,计数的我们的东西的总和。但是,这种方法几乎没有问题:

  • g.V().has('group',y).out('member_of').skip(0).limit(10)- 根据文档,这种遍历每次可以返回不同的结果。所以以这种方式创建包是不正确的
  • g.V().has('group',y).out('member_of').skip(100_000).limit(10) 花费太长时间,因为正如我们发现的那样,数据库仍然需要访问 100k 个顶点

因此,我们的下一个方法是存储一个遍历,该遍历会发出束,members然后在单独的线程中执行并行遍历,这些遍历对先前获取的成员进行计数:

while(is_not_the_end) {
   List<Members> members = g.V().has('group',y).out('member_of').next(100)`
   addMembersToExecutorThread(members) // done in async way
}
Run Code Online (Sandbox Code Playgroud)

那么,当你遇到这样的场景时,有什么方法呢?基本上,如果可以找到一种方法来快速获取某个顶点的所有祖先,我们就可以解决该问题。在我们的例子中,这将是一个group_1. 但是仅仅通过使用g.V().has('group',y).out('member_of').properties('members_id').

有没有办法解决这个问题?或者我们应该尝试在 GraphComputer 上执行这样的查询?

gremlin tinkerpop tinkerpop3 gremlin-server janusgraph

5
推荐指数
1
解决办法
412
查看次数

Web 应用程序中的 Gremlin Python

我有一个 python flask web 应用程序,它使用gremlin_python. 一个基本问题是初始化图遍历对象的正确方法。

  1. 我可以初始化我的遍历g = traversal().withRemote(DriverRemoteConnection(...)g跨请求保留遍历变量吗?(所有请求都针对同一个图表。我尝试了这个并开始tornado.iostream.StreamClosedError断断续续。
  2. 第二个选项是为每个请求创建一个遍历。我不太了解 gremlin python 架构;每个请求执行此操作是否有大量开销?

谢谢你

python gremlin janusgraph gremlinpython

5
推荐指数
1
解决办法
452
查看次数

gremlin python - 向顶点添加多个但数量未知的属性

我想向一个顶点添加多个属性,但从一开始就没有明确知道这些属性可能是什么。例如,假设将一个人作为顶点添加到图中,我们有以下属性字典:

人 1

{
    "id": 1,
    "first_name": "bob",
    "age": 25,
    "height": 177
}
Run Code Online (Sandbox Code Playgroud)

也许要添加另一个顶点,一个人具有以下属性:

人 2

{
    "id": 2,
    "first_name": "joe",
    "surname": "bloggs",
    "occupation": "lawyer",
    "birthday": "12 September"
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将两个人都添加到图中,而无需将属性键和值显式硬编码到 Gremlin属性函数中?

链接提供了正确方向的答案。可在此处找到更多有用信息。以下行反映了建议的解决方案,按预期执行,并将新顶点添加到图中。伟大的。

g.addV("person").property("id", 1, "first_name", "bob", "age", 25, "height", 177).next()
Run Code Online (Sandbox Code Playgroud)

但是,它仅在输入是硬编码的情况下才寻求工作。我已将属性字典转换为 (k1, v1, k2, v2, ..., kn, vn) 形式的值元组,但我无法以编程方式传递值。例如

tup_vals = ("id", 1, "first_name", "bob", "age", 25, "height", 177)
Run Code Online (Sandbox Code Playgroud)

但无论出于何种原因,我都不能打电话:

g.addV("person").property(*tup_vals).next()
Run Code Online (Sandbox Code Playgroud)

上面的行不会抛出异常,它只是没有按预期执行(即没有传入属性)

有没有人对如何以计算方式将这些属性字典传递给 Gremlin 属性函数有任何见解?


更新:幼稚/低效的解决方案

下面提供了一个解决方案,但这是一个糟糕的解决方案,因为它每次迭代都会查询 gremlin 服务器。理想情况下,我想同时添加所有属性。并且只有在 id 是唯一的情况下才能真正按预期工作。

g.addV("person").property('id', id).next()

for …
Run Code Online (Sandbox Code Playgroud)

python gremlin tinkerpop tinkerpop3 gremlin-server

5
推荐指数
1
解决办法
1969
查看次数