【发布时间】:2020-02-04 14:04:58
【问题描述】:
查询应该如下:
- 如果两个顶点之间存在边:返回边
- else:创建边缘,从 dict 设置属性并返回边缘。
如果traversal 是原始遍历,则以下内容有效。
如果traversal 已经包含一些其他步骤(例如创建顶点)
它崩溃并出现以下错误。
properties = {"p1": "p1_value", "p2": "p2_value"}
traversal.V().inject(properties).as_(props_label).
V().has("uuid",from_uuid).as_(from_label).
V().has("uuid",to_uuid).as_(to_label).
coalesce(inE(edge_label).where(outV().
as_(from_label)),addE(edge_label).
from_(from_label).as_(e_label).select(props_label).
unfold().as_(kv_label).select(e_label).
property(select(kv_label).by(Column.keys),select(kv_label).by(Column.values))).iterate()
gremlin_python.driver.protocol.GremlinServerError: 500: The provided object does not have accessible keys: class org.janusgraph.graphdb.vertices.StandardVertex
如果我在injecting 之前遍历iterate(),它可以工作。但出于性能原因,我想避免迭代。
有什么想法吗?
编辑:
我做了更多的测试。预先添加顶点有效。 在同一个查询中添加它们不会。
这行得通:
gremlin> g.addV("TestType").property("name", "1")
==>v[2302192]
gremlin> g.addV("TestType").property("name", "2")
==>v[2326704]
gremlin> g.inject(["p1": "v1", "p2": "v2"]).unfold().as("props").V(2302192).as("from").V(2326704).as("to").coalesce(inE("DEPENDS_ON").where(outV().as("from")), addE("DEPENDS_ON").from("from").property(select("props").by(keys), select("props").by(values)))
==>e[187by-1dcds-1lh-1dvao][2302192-DEPENDS_ON->2326704]
==>e[187by-1dcds-1lh-1dvao][2302192-DEPENDS_ON->2326704]
这失败了:
gremlin> g.addV("TestType").property("name", "1").addV("TestType").property("name", "2").inject(["p1": "v1", "p2": "v2"]).unfold().as("props").V().has("name", "1").as("from").V().has("name", "2").as("to").coalesce(inE("DEPENDS_ON").where(outV().as("from")), addE("DEPENDS_ON").from("from").property(select("props").by(keys), select("props").by(values))).dedup()
The provided object does not have accessible keys: class org.janusgraph.graphdb.vertices.StandardVertex
【问题讨论】:
-
我不太明白你的问题的几个方面。具体来说,我不确定我知道你所说的“原始遍历”是什么意思,我不知道你最后一句关于“迭代()......注入之前”的意思以及关于性能的观点。如果我在下面的回答没有帮助,您可能需要就这些问题进一步澄清您的问题。
-
@stephenmallette 这是一个更大的项目的一部分,该项目试图将 python 对象映射到顶点。它在解析对象图时添加多个顶点和边。当前的实现速度非常慢。我的观察是,我的 iterate() 调用越少,它的速度就越快,即 gremlin 查询的时间越长。在我上面的示例中,
traversal可以是新的,也可以已经包含多个 addV() 调用。在后一种情况下,注入中断。 -
我认为您是在说您将多个突变组合到一个遍历中,以尝试通过减少单个请求的数量来提高性能。只是在
inject()前面添加V()会导致您看到的失败吗?还是必须明确包含addV()?如果是这样,有多少是“几个” - 也许,只需使用导致问题的特定遍历来更新您的问题?顺便说一句,Gremlin 控制台中的失败示例将是调试此问题的最简单方法。 -
@stephenmallette 我用一个具体的例子更新了这个问题。
addV()导致问题。V()工作。 -
感谢您花时间在 Gremlin Console 中创建可重现的条件。这几乎总是使解决问题变得容易。我已经更新了我的答案。
标签: gremlin tinkerpop3 janusgraph