如何在一个 gremlin 查询或 Gremlin.Net 中获取带有顶点信息的属性 hasid/key

How to get properties hasid/key with vertexes info in one gremlin query or Gremlin.Net

我尝试在 Gremlin.Net 的后续查询中获取具有键或 ID 的属性,但 VertexProperty 中的顶点信息(ID 和标签)在结果中为空。

g.V().Properties<VertexProperty>().HasKey(somekey).Promise(p => p.ToList())

所以我尝试了另一种方式,但是 return class 是路径,我不得不写一个丑陋的类型转换代码。

g.V().Properties<VertexProperty>().HasKey(somekey).Path().By(__.ValueMap<object, object>(true))

有没有更好的方法来实现这个需求

我想基本上唯一缺少的就是the Project() step

为了找到所有具有某个 属性 键的顶点,然后得到它们的 id,标签,然后得到关于那个 属性 的所有信息,你可以使用这个遍历:

g.V().
    Has(someKey).
    Project<object>("vertexId", "vertexLabel", "property").
        By(T.Id).
        By(T.Label).
        By(__.Properties<object>(someKey).ElementMap<object>()).
    Promise(t => t.ToList());

这个 returns 一个 Dictionary 其中键是给 Project 步骤的参数。

如果您想按某个 属性 id 而不是 属性 键进行过滤,那么您可以采用非常相似的方式进行过滤:

g.V().
    Where(__.Properties<object>().HasId(propertyId)).
    Project<object>("vertexId", "vertexLabel", "property").
        By(T.Id).
        By(T.Label).
        By(__.Properties<object>(someKey).ElementMap<object>()).
    Promise(t => t.ToList());

在这两种情况下,这首先过滤顶点以仅具有具有我们正在寻找的属性的顶点。这样,我们可以在之后使用 Project() 步骤来取回所需的数据。 ElementMap 应该返回有关您想要的属性的所有信息。

但是请注意,这些遍历很可能需要在 JanusGraph 中进行完整的图形扫描,这意味着它必须遍历图形中的所有顶点。原因是这些遍历不能使用使它们更有效的索引。因此,对于较大的图,遍历可能不可行。

如果在第二次遍历中有可用的顶点 id 而不是 属性 id,那么只需将 g.V().Where([...]) 替换为 g.V(id) 就可以使遍历更加高效.