我想在OrientDB中使用Blueprints和Pipes.方法是什么?还有TinkerPop3或TinkerPop2?哪个对我的学习经历更好?
执行以下遍历时:
graph.addVertex("a")
graph.addVertex("b")
graph.addVertex("c")
graph.traversal().V().range(0,2)
graph.traversal().V().range(2,3)
Run Code Online (Sandbox Code Playgroud)
在使用范围功能时,是什么决定了我获得这些顶点的顺序?我保证得到所有三个顶点a,b和c吗?
我正在添加这样的顶点:
g.addV("foobar").property("id", 1).property(...etc...
如何使用 uuid 而不是整数 id 设置属性?
刚开始使用 Tinkerpop 和 Janusgraph,我正试图根据文档弄清楚这一点。
但首先我需要一种将数据导入 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他们属于哪个?
为这些可能直截了当的问题道歉,但我对此很陌生。
我将 JanusGraph 与标准 python gremlin 绑定一起使用,我想float[]
在顶点/边上设置一个属性。但是,Python的Tinkerpop 驱动程序似乎无法做到这一点。
例如,下面是一个直接在 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[]
.
问题是 - 除了编写显式查询字符串之外,是否有任何理智的方法可以做到这一点?
在我们的图中,有很多顶点的输出边超过 100k。我想知道处理由此产生的所有情况的方法是什么。
假设我们group_1
在图中定义了一个。group_1
有 100k members
。我们有一些从member_x
顶点开始的遍历并计算一些东西。这些遍历非常快,每次都在大约 2 秒内结束。
但是时代变了,现在我们需要将单个小遍历的所有结果汇总为一个数字。遍历必须包含来自group_1
's 成员的所有结果。
最初,我们的方法是创建其发射一束遍历members_x
通过使用skip
和limit
,然后,在应用层上采用并行处理,计数的我们的东西的总和。但是,这种方法几乎没有问题:
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 上执行这样的查询?
我在我的 Java 后端使用嵌入式 janusgraph 我的代码取决于从 graph = JanusGraphFactory.open(conf)
AFAIK 这直接连接到 Cassandra 和弹性搜索,并在我的后端应用程序 JVM 中运行 janusgraph 处理器。但是如果我想扩展 janusgraph,我需要在集群上运行单独的 janusgraph 服务器,并且需要作为客户端从我的后端连接到这些服务器。
根据github上的远程 janusgraph 示例,这是通过实例化一个 EmptyGraph 来完成的,该 EmptyGraphgraph = EmptyGraph.instance();
不是 JanusGraph 的实例,而是 org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
.
我可以从上面的示例中了解到,我只能通过将 gremlin 查询提交给 janusgraph 服务器来使用它们,但是除非将代码作为字符串提交给服务器,否则我将无法直接使用管理 API。
最后,我可以理解,单独运行 janusgraph 服务器对可扩展性更好,但我将无法在我的代码中直接访问 janusgraph api,所以我想知道我是否理解了一些我想念的 内容以及远程部署方法的优缺点和嵌入式方法相比我会失去什么?
编辑:
根据这个答案 纠正它,如果错了:
连接到远程 gremlin 服务器的优缺点
优点
缺点
我想向一个顶点添加多个属性,但从一开始就没有明确知道这些属性可能是什么。例如,假设将一个人作为顶点添加到图中,我们有以下属性字典:
人 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) 我正在尝试.valueMap().with(WithOptions.tokens)
在针对 AWS Neptune 的查询中使用。我明白了MalformedQueryException
。我怀疑这是 Gremlin 3.4 中的一个新功能。*
我找不到概述 Neptune 支持的语法版本的页面。
这些信息在哪里存在?
上下文:
我确实有一个大约有 2000 个顶点和 6000 条边的图,随着时间的推移,这可能会增长到 10000 个顶点和 100000 条边。目前我正在使用以下遍历查询更新新顶点:
向上插入顶点和边
queryVertex = "g.V().has(label, name, foo).fold().coalesce(
unfold(), addV(label).property(name, foo).property(model, 2)
).property(model, 2)"
Run Code Online (Sandbox Code Playgroud)
这里的目的是寻找名为 foo 的顶点,如果找到则更新其model
属性,否则创建一个新顶点并设置该model
属性。这发出两次:一次是针对源顶点,一次是针对目标顶点。
创建两个相关顶点后,将发出另一个查询以创建它们之间的边:
queryEdge = "g.V('id_of_source_vertex').coalesce(
outE(edge_label).filter(inV().hasId('id_of_target_vertex')),
addE(edge_label).to(V('id_of_target_vertex'))
).property(model, 2)"
Run Code Online (Sandbox Code Playgroud)
在这里,如果两个顶点之间存在model
边,则更新边上的属性,否则会在它们之间创建边。
执行此操作的伪代码如下:
for each edge in the list of new edges:
//upsert source and target vertices:
execute queryVertex for edge.source
execute queryVertex for edge.target
// upsert edge:
execute queryEdge
Run Code Online (Sandbox Code Playgroud)
这行得通,但效率极低;例如,对于上述图形大小,它需要几分钟才能完成,并且通过一些应用内并发,它只将时间减少了几分钟。当然,对于如此小的图尺寸,必须有一种更有效的方法来做到这一点。
问题
* 如何使这些 upsert 更快?
tinkerpop ×10
gremlin ×7
tinkerpop3 ×5
janusgraph ×4
python ×3
graph ×1
java ×1
orientdb ×1
titan ×1