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
对于组)感觉是多余的。--但是,最后,如果速度更快,我可能会这样做。我不认为有任何冗余。在我的示例查询中,仅为路径的开始节点和结束节点指示标签,而不是为路径之间的节点指示标签。您需要定义感兴趣的路径。我的方法是使用关系类型,而你的方法是通过过滤中间节点的标签。