检索不同标记的顶点,顶点属性之间 AND/OR

Retrieve different labeled vertices, AND/OR between vertices properties

下面是我的图表

 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 - 获取对象顶点的基于对象顶点 属性 或层次结构中的文件夹顶点 属性,这意味着所有对象都可以基于文件夹顶点 属性 访问在任何级别。

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

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?

#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()