Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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 Cypher通过关系和节点的模式返回多个跃点_Neo4j_Cypher - Fatal编程技术网

Neo4j Cypher通过关系和节点的模式返回多个跃点

Neo4j Cypher通过关系和节点的模式返回多个跃点,neo4j,cypher,Neo4j,Cypher,我正在用neo4j制作一个概念验证访问控制系统,我需要一些Cypher方面的帮助 数据模型如下: (:User|Business)-[:can]->(:Permission)<-[:allows]-(:Business) MATCH path = (:User {userId: $id})-[:can]->(:Permission) <-[:allows]-(:Business)) RETURN path 但这没有任何方向,我也不知道如何在不将返回的匹配减少为

我正在用neo4j制作一个概念验证访问控制系统,我需要一些Cypher方面的帮助

数据模型如下:

(:User|Business)-[:can]->(:Permission)<-[:allows]-(:Business)
MATCH path = (:User {userId: $id})-[:can]->(:Permission)
    <-[:allows]-(:Business))
RETURN path
但这没有任何方向,我也不知道如何在不将返回的匹配减少为仅直接匹配的情况下包含方向(即,在第一次点击
:Business
节点后,它不会继续)

所以我想知道的是:

  • 有没有办法在一个查询中匹配多个跃点
  • 我是否应该对此进行完全不同的建模
  • 我是否完全走错了路,查询是否应该完全正确 重写

  • 可以按如下方式指定路径:

    (:User|Business)-[:can]->(:Permission)<-[:allows]-(:Business)
    
    MATCH path = (:User {userId: $id})-[:can]->(:Permission)
        <-[:allows]-(:Business))
    RETURN path
    
    匹配路径=(:User{userId:$id})-[:can]->(:权限)
    
    目前,可变长度扩展的语法不允许对某些类型的单独方向进行精细控制。围绕这一点正在进行改进,但目前仅靠Cypher无法满足您的需求

    我们可以使用APOC过程来实现这一点,因为扩展中支持对类型方向和关系序列的精细控制

    但是,首先,您需要弄清楚如何处理用户或业务匹配,方法是向这些节点添加一个公共标签,通过该标签可以按属性匹配任一类型,或者可以使用一个子查询和两个联合查询,一个用于:business nodes,另一个用于:user nodes,这样您仍然可以利用其中一个节点上的索引,并在单个变量中得到可能的结果

    一旦获得了这些,就可以使用
    apoc.path.expandConfig()
    ,传递一些选项以获得所需的内容:

    // assume you've matched to your `start` node already
    CALL apoc.path.expandConfig(start, {relationshipFilter:'can>|<allows', labelFilter:'>Business'}) YIELD path
    RETURN path
    
    //假设您已经匹配了“开始”节点
    调用apoc.path.expandConfig(开始,{relationshipFilter:'can>| Business'})产生路径
    返回路径
    

    这一个不使用序列,但它限制了每种关系类型的扩展方向。我们还将labelFilter设置为:业务节点是路径的结束节点,而不是任何其他标签的节点。

    我看到通过路径扩展APOC过程提供了一个很好的解决方案。
    但我会关注你的观点#2:“我应该完全不同地建模吗?” 嗯,不完全是,但我认为是的

    使用Neo4j的真正解放之处在于,您可以像更改驾驶策略一样轻松地更改正在行驶的道路:模型vs查询。由于您处于项目的早期阶段,您可以使用不同的模型进行实验。这是一个很好的机会,只需对语义进行更改,就可以围绕问题进行“结束运行”

    Neo4j中关系的语义通过

  • 指定给关系的强制类型,与
  • 选择指向强制箭头的方向
  • 使用APOC解决的技巧是如何遍历一条关系路径,该路径在沿着查询路径向前和向后指向之间交替。但是,在找到一个有力的工具之前,为什么不把你两种关系的方向都颠倒过来呢。您可以从更改允许的模型

    <-[:allows]-
    
    这给你买了很多。现在,两个关系的方向相同,您可以在匹配模式中将两个关系合并为一个关系。路径遍历可以这样表示,short&sweet:

    (u:User)-[:can|is_allowed_by*]->(c:Company)
    

    这将不遗余力地查找每个用户到公司的路径,包括分支。

    您好,谢谢您的回复。不幸的是,这会在第一个跃点之后终止,并且在第一个业务节点之后不会继续遍历eah,我可能误解了数据结构,并假设结果将是一组
    ()-->(),这正是我所需要的!非常感谢。
    
    (u:User)-[:can|is_allowed_by*]->(c:Company)