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
Neo4j:查询具有指定关系的所有路径_Neo4j_Cypher - Fatal编程技术网

Neo4j:查询具有指定关系的所有路径

Neo4j:查询具有指定关系的所有路径,neo4j,cypher,Neo4j,Cypher,我试图查询一个图,以返回具有指定关系的所有路径 我正在构建一个族谱,我有以下节点: 人 边缘 连接两个人的关系包括: 母公司 孩子 夫妻 因此,一些数据的示例如下: a:人B:人 例如:这个人 在我的查询中,我希望能够在我的前端绘制图形,因此我需要获得每个人和边缘节点,以及它们之间的每个关系,这些关系连接到我的起始人 我最初尝试使用AllShortestPath来减少节点的重复,但这会丢失很多关系(例如,如果父母有多个子女,则只会返回与子女的母亲或父亲关系,而不会同时返回两者)。我当前的密码如下

我试图查询一个图,以返回具有指定关系的所有路径

我正在构建一个族谱,我有以下节点:

  • 边缘
  • 连接两个人的关系包括:

  • 母公司
  • 孩子
  • 夫妻
  • 因此,一些数据的示例如下:

  • a:人B:人
  • 例如:这个人
  • 在我的查询中,我希望能够在我的前端绘制图形,因此我需要获得每个人和边缘节点,以及它们之间的每个关系,这些关系连接到我的起始人

    我最初尝试使用AllShortestPath来减少节点的重复,但这会丢失很多关系(例如,如果父母有多个子女,则只会返回与子女的母亲或父亲关系,而不会同时返回两者)。我当前的密码如下(我通过过滤仅存在于关系上的type属性来区分Edge和Person节点):

    我认为这是可行的,但我意识到最短路径会破坏一些关系。我想找到所有相关节点和所有关系,然后处理结果以构建正确的格式,但我觉得可能有一种更简单/更有效的方法

    更新日期2014年1月6日

    我已经尝试返回所有路径,但是模型可以有循环,因此返回的路径数量随着大小呈指数增长。下面的密码创建了一个示例数据集

    CREATE (p1:Person)<-[:CHILD]-(r1:Edge { type:'parentChild' })-[:PARENT]->(p2:Person)
    <-[:COUPLE]-(r2:Edge { type:'couple' })-[:COUPLE]->(p3:Person)<-[:PARENT]-
    (r3:Edge { type:'parentChild' })-[:CHILD]->p1<-[:COUPLE]-(r4:Edge { type:'couple' })-[:COUPLE]->
    (p4:Person)<-[:CHILD]-(r5:Edge { type:'parentChild' })-[:PARENT]->(p5:Person)<-[:COUPLE]-
    (r6:Edge { type:'couple' })-[:COUPLE]->(p6:Person)<-[:PARENT]-(r7:Edge { type:'parentChild' })-
    [:CHILD]->p4, 
    p5<-[:PARENT]-(r8:Edge { type:'parentChild' })-[:CHILD]->(p7:Person),
    p5<-[:PARENT]-(r9:Edge { type:'parentChild' })-[:CHILD]->(p8:Person), 
    p5<-[:PARENT]-(r10:Edge { type:'parentChild' })-[:CHILD]->(p9:Person)
    
    CREATE(p1:Person)(p2:Person)
    (p3:人)p1
    (p4:人)(p5:人)(p6:人)p4,
    p5(第7页:个人),
    p5(第8页:个人),
    p5(第9页:个人)
    
    此图显示了数据的视图


    所需的结果是每个节点边缘节点连接对应一行。这个数据总共有10行,但由于循环的原因,当我返回所有路径时,我得到了128行。有没有更有效的过滤路径的方法?

    为了解决这个问题,我使用了以下密码

    START person = node({personId})' +
    MATCH person-[:PARENT | CHILD | COUPLE*0..]-(p:Person)
    WITH distinct p
    MATCH p-[r]-(edge:Edge), p-[:NAME]->(name), p-[:GENDER]->gender, edge-[:FACT]->(fact)
    RETURN p, id(p), collect(name), gender, type(r), id(edge), collect(fact.type)
    ORDER BY id(edge)
    
    我曾经在关系中使用*0..来匹配所有已连接的“Person”节点,包括原始节点。删除重复项后,只需查找节点之间的所有关系和每个点上的额外信息

    这个密码为每个“人”到“边缘”关系返回一行。“个人”信息中存在一些重复,但一旦返回数据,就很容易解析出来


    感谢您的评论和帮助。

    如果只进行路径匹配而没有最短路径,会发生什么?你能用聚合或分离来限制复制吗?Michael-谢谢你的回复,但我不知道如何减少返回路径的数量。我添加了更多的细节,希望能更详细地解释这个问题。感谢您的帮助。您是否考虑过使用事务性rest资源并请求
    “resultdatacontents”:“graph”
    ?我不知道您需要返回什么来正确地可视化数据,但您可以尝试匹配您的模式,将所有不同的关系提取并收集为一个结果行,按“图形”请求,并且结果应该是非冗余的,并且易于解析以供可视化。
    START person = node({personId})' +
    MATCH person-[:PARENT | CHILD | COUPLE*0..]-(p:Person)
    WITH distinct p
    MATCH p-[r]-(edge:Edge), p-[:NAME]->(name), p-[:GENDER]->gender, edge-[:FACT]->(fact)
    RETURN p, id(p), collect(name), gender, type(r), id(edge), collect(fact.type)
    ORDER BY id(edge)