在收集每个节点的最短路径/ JSON的Neo4j APOC

问题描述 投票:0回答:1

短任务描述:我有一个JSON文件,一组起源/源节点组成,他们每个人我需要找到的既定目标节点的第1,第2和第3的最短路径。输入JSON如下:

{
    "origin":[
        {"label":"Alcohol drinks",
        "tag":[],
        "type":"string",
        "xpath":[]
        },

        {"label":"Wine",
        "tag":["red","white"],
        "type":"string",
        "xpath":["Alcohol drinks"]
        },

        {"label":"Port wine",
        "tag":["Portugal","sweet","strong"],
        "type":"string",
        "xpath":["Alcohol drinks","Wine"]
        },

        {"label":"Sandeman Cask 33",
        "tag":["red","expensive"],
        "type":"string",
        "xpath":["Alcohol drinks","Wine","Port wine"]
        }
    ],

    "target":[
        {"label":"Drinks",
        "tag":[],
        "type":"string",
        "xpath":[]
        },

        {"label":"Tea",
        "tag":["black", "green"],
        "type":"string",
        "xpath":["Drinks"]
        },

        {"label":"Carbonated water",
        "tag":[],
        "type":"string",
        "xpath":["Drinks","Tea"]
        },

        {
        "label":"Pepsi",
        "tag":["sweet","cheap"],
        "type":"string",
        "xpath":["Drinks","Tea","Carbonated water"]
        }
    ]
}

节点已插入到数据库和相应的关系是建立。节点连接,因此能够建立从原点的至少一个路径来定位。

为了找到我使用下面的Cypher查询的最短路径:

    CALL apoc.load.json("file:///D:/project/neo_proj/input.json") YIELD value 
UNWIND value.origin AS orig UNWIND value.target AS tar 
MATCH(origin:concept{name:orig.label}) 
MATCH(target:concept{name:tar.label}), 
path = shortestPath((origin)-[*1..3]-(target)) RETURN path ORDER BY length(path) ASC LIMIT 4

该查询全部映射到所有目标节点的起源节点。但是,我需要这样的东西:

   CALL apoc.load.json("file:///D:/project/neo_proj/input.json") YIELD value
UNWIND value.origin AS orig UNWIND value.target AS tar 
MATCH(origin:concept{name:orig.label}) MATCH(target:concept{name:tar.label}) 
FOREACH (x IN orig.label 
| MERGE(origin:concept{name:orig.label}) 
MERGE(target:concept{name:tar.label}) 
path = shortestPath((origin)-[*1..3]-(target))) RETURN path ORDER BY length(path) ASC LIMIT 3

此查询不工作,但想法是能够使用foreach循环,采取先产地标签,并试图找到第一,第二,第三最短路径的目标之一,那么第2原点,第三产地等我将不胜感激,如果你能指出我,我该如何使用foreach循环中连接shortpath在寻找适当的方式。先感谢您!

json neo4j cypher neo4j-apoc
1个回答
0
投票

你不能以这种方式使用FOREACH。

可能是你最好的选择将是使用APOC路径扩展特效,这些可以使用最短路径BFS扩展,并且可以在每个呼叫结果的数量是有限的(和呼叫将为起源和目标的每一行配对执行) ,所以用正确的方法(使用spanningTree()在这里,以确保我们访问每个节点恰好一次,我们在最后返回路径),你会得到高达产地/目标组合的3条最短路径。

这也将有助于分别处理的起源和目标,作为当前方法创造了它们之间的笛卡尔积,这似乎是你想要寻找的路径,但找到的起源和目标节点时,它会导致浪费多余的匹配操作。

CALL apoc.load.json("file:///D:/project/neo_proj/input.json") YIELD value 
UNWIND value.origin AS orig 
MATCH(origin:concept{name:orig.label}) 
WITH value, collect(origin) as origins
UNWIND value.target AS tar 
MATCH(target:concept{name:tar.label})
UNWIND origins as origin
WITH origin, tar
CALL apoc.path.spanningTree(origin, {terminatorNodes:[tar], maxLevel:3, limit:3}) YIELD path
RETURN origin, tar, length(path) as pathLength, path
© www.soinside.com 2019 - 2024. All rights reserved.