【问题标题】:Retrieve different labeled vertices, AND/OR between vertices properties检索不同的标记顶点,顶点属性之间的 AND/OR
【发布时间】:2020-01-07 17:00:09
【问题描述】:

下面是我的图表

 g.addV('user').property('userId','user1').as('u1').
      addV('user').property('userId','user2').as('u2').
      addV('user').property('userId','user3').as('u3').
      addV('group').property('groupId','group1').as('g1').
      addV('group').property('groupId','group2').as('g2').
      addV('group').property('groupId','group3').as('g3').
      addV('folder').property('folderId','folder1').property('folderName','level1_1').property('description','level1_desc1').as('f1').
      addV('folder').property('folderId','folder2').property('folderName','level2_2').property('description','level2_desc2').as('f2').
      addV('folder').property('folderId','folder3').property('folderName','level3_3').property('description','level3_desc3').as('f3').
      addV('object').property('objId','obj1').property('objTitle','objtitle1_1').property('description','o1_desc1').as('o1').
      addV('object').property('objId','obj2').property('objTitle','objtitle2_2').property('description','o2_desc2').as('o2').
      addV('object').property('objId','obj3').property('objTitle','objtitle3_3').property('description','o3_desc3').as('o3').
      addE('in_folder').from('o1').to('f2').
      addE('in_folder').from('o2').to('f3').
      addE('in_folder').from('o1').to('f3').
      addE('in_folder').from('f2').to('f1').
      addE('in_folder').from('f3').to('f2').
      addE('member_of').from('u1').to('g1').
      addE('member_of').from('u2').to('g2').
      addE('member_of').from('u3').to('g3').
      addE('member_of').from('g3').to('g1').
      addE('has_permission').from('g1').to('f1').
      addE('has_permission').from('g1').to('f1').
      addE('has_permission').from('g2').to('f2').
      addE('has_permission').from('g3').to('f3').
      addE('has_permission').from('u2').to('f1').iterate()   

图表上的两个问题

#1 - 我如何在单个查询中检索用户可以访问的所有文件夹和对象

g.V().has('user','userId','user1').emit().until(__.not(outE('member_of'))).repeat(out('member_of')).outE('has_permission').inV().as('f').inE('in_folder').outV().as('a').select('a','f').range(1,20)

但是这个查询会导致每个对象及其文件夹顶点,而不是我的期望是接收像搜索结果一样考虑文件夹和对象作为搜索结果?

#2 - 在层次结构中获取对象顶点的基于对象顶点属性或文件夹顶点属性,这意味着所有对象都可以基于任何级别的文件夹顶点属性。

我写了下面的查询,当文件夹和对象顶点属性值匹配时返回结果。

g.V().has('user','userId','user1').emit().until(__.not(outE('member_of'))).repeat(out('member_of')).outE('has_permission').inV().has('folderName',textContains('level1')).inE('in').outV().has('objTitle',textContains('objtitle3')).as('o').select('o').valueMap('objTitle','objId').dedup().range(1,20)

如何在对象和文件夹顶点属性之间进行 OR 以及如何对文件夹和对象顶点的多个属性进行 OR?

【问题讨论】:

  • 第二个问题你能详细介绍一下吗?例如预期结果或描述问题的数字。
  • 根据文件夹顶点的属性值或对象自身属性值检索对象。在我所写的查询中,获取与 folderName 属性文本和 objTitle 属性文本匹配的对象。我如何使这个 OR 子句匹配任何一个文本。查询显示每个顶点类型的一个字段,但需要实时检查多个属性值之间的 OR 子句。
  • 当 .has('folderName',textContains('fake')) 提供的静态对象文本与某些数据匹配时,我编写的查询应该返回结果

标签: acl graph-databases gremlin janusgraph


【解决方案1】:

#1 - 我如何在单个查询中检索用户可以访问的所有文件夹和对象

g.V().has('user','userId','user1').
repeat(out('member_of')).emit().
until(__.not(outE('member_of'))).
out('has_permission').dedup().
union(
// all folders
identity(),
// all sub-folders and objects
__.repeat(__.in('in_folder')).emit().until(__.not(inE('in_folder')))
).dedup()

【讨论】:

  • 嗨,Sel,上面的查询出现错误。 No signature of method: groovysh_evaluate.indentify() is applicable for argument types: () values: [] Possible solutions: identity(groovy.lang.Closure), notify()
  • graph=JanusGraphFactory.open('conf/gremlin-server/janusgraph-cql-es-server.properties') 使用 Janusgraph 工厂获取遍历对象。
  • 应该是 identity() 而不是 indentify()。
猜你喜欢
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2020-09-28
相关资源
最近更新 更多