Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j:在节点标签上具有可变长度和条件的密码查询 我在找什么_Neo4j_Cypher - Fatal编程技术网

Neo4j:在节点标签上具有可变长度和条件的密码查询 我在找什么

Neo4j:在节点标签上具有可变长度和条件的密码查询 我在找什么,neo4j,cypher,Neo4j,Cypher,使用可变长度关系(请参阅),可以在两个节点之间具有具有特定标签的可变数量的关系 # Cypher match (g1:Group)-[:sub_group*]->(g2:Group) return g1, g2 我正在寻找与节点相同的东西,即查询两个节点的方法,两个节点之间的节点数量可变,但在节点上使用标签条件,而不是关系: # Looking for something like this in Cypher: match (g1:Group)-->(:Group*)-->

使用可变长度关系(请参阅),可以在两个节点之间具有具有特定标签的可变数量的关系

# Cypher
match (g1:Group)-[:sub_group*]->(g2:Group) return g1, g2
我正在寻找与节点相同的东西,即查询两个节点的方法,两个节点之间的节点数量可变,但在节点上使用标签条件,而不是关系

# Looking for something like this in Cypher:
match (g1:Group)-->(:Group*)-->(g2:Group) return g1, g2
例子 例如,我将使用此机制在组结构中查找组的所有(直接或间接)成员

# Looking for somthing like this in Cypher:
match (group:Group)-->(:Group*)-->(member:User) return member
以这种结构为例:

group1:Group
   |-------> group2:Group -------> user1:User
   |-------> group3:Group
                  |--------> page1:Page -----> group4:Group -----> user2:User
在此示例中,
user1
group1
group2
的成员,但是
user2
只是
group4
的成员,而不是其他组的成员,因为在这两个组之间有一个非
标记的节点

抽象 更抽象的模式是一种在Cypher中的重复运算符
|…*

# Looking for repeat operator in Cypher:
match (g1:Group)|-[:is_subgroup_of]->(:Group)|*-[:is_member_of]->(member:User) 
return member
有人知道这样的重复操作员吗?谢谢

可能的解决办法 我发现的一个解决方案是在节点上使用一个条件,使用
where
,但我希望有一个更好(更短)的解决方案

# Cypher
match path = (member:User)<-[*]-(g:Group{id:1}) 
where all(node in tail(nodes(path)) where ('Group' in labels(node))) 
return member
#密码
匹配路径=(成员:用户)这个怎么样:

MATCH (:Group {id:1})<-[:IS_SUBGROUP_OF|:IS_MEMBER_OF*]-(u:User)
RETURN DISTINCT u

MATCH(:Group{id:1})是的,这是我的“后备方法”。但我不喜欢其中的冗余:我已经告诉了节点它们的类型(标签):
:User
:Group
,等等。现在,将相同的信息也输入到关系中(
:is_member_of
对于用户,
:is_subgroup of
对于组)感觉是多余的。--但是,最后,如果速度更快,我可能会这样做。我不认为有任何冗余。在我的示例查询中,仅为路径的开始节点和结束节点指示标签,而不是为路径之间的节点指示标签。您需要定义感兴趣的路径。我的方法是使用关系类型,而你的方法是通过过滤中间节点的标签。