gpt4 book ai didi

neo4j - 从图形中获取文本格式的路径

转载 作者:行者123 更新时间:2023-12-04 14:33:27 25 4
gpt4 key购买 nike

在我的图表中,我有如下方式的数据。

这里 a,b,c,d 是节点,r1,r2,r3,r4 是关系。

a-r1->b
b-r2->a
b-r2->c
c-r1->b
d-r3->a
a-r1->d like this.

我正在使用以下 Cypher 来获取最大深度为 3 的路径。

MATCH p=(n)-[r*1..3]-(m) WHERE n.id=1 and m.id=2  RETURN p 

这里返回 p 是路径,我想以这样的文本格式显示路径。

示例:假设路径长度为 3。a-r1->b-r2->c 这样的文本格式。

这可能吗?

最佳答案

有点。我会给你大部分的答案,但我自己无法完成答案。也许另一个密码向导会出现并改进答案,但这就是我为您准备的。

match p=(n)-[r*1..3]-(m) 
WHERE id(n)=1 AND id(m)=2
WITH extract(node in nodes(p) | coalesce(node.label, "")) as nodeLabels,
extract(rel in relationships(p) | type(rel)) as relationshipLabels
WITH reduce(nodePath="", nodeLabel in nodeLabels | nodePath + nodeLabel + "-") as nodePath,
reduce(relPath="", relLabel in relationshipLabels | relPath + relLabel + "-") as relPath
RETURN nodePath, relPath
LIMIT 1;

编辑 - 一张小纸条,在您的问题中指定WHERE 条件n.id=1 和m.id=2。请注意,这可能不是您想要的。节点 ID 通常使用 WHERE id(n)=1 AND id(m)=2 检查。 Id 在技术上不是节点属性,所以我更改了它。

好的,所以我们要匹配路径。然后我们将使用 extract 函数从节点中提取 label 属性,并创建一个名为 nodeLabels 的集合。我们将为关系类型做同样的事情。 reduce 在这里所做的是将这些集合中的每个单独的字符串累积成一个字符串。因此,如果您的节点是 a、b 和 c,您将得到一个看起来像 a-b-c-nodePath 字符串。同样,您的关系字符串看起来像 r1-r2-r3-

现在,我知道您想要那些交错的,并且您更喜欢像 a-r1-b-r2-c 这样的输出。这是我看到的问题......

通常,我采用的方法是使用 FOREACH迭代节点标签集合。由于路径是什么,您知道关系比节点少一个,理想情况下(在伪代码中)我想做这样的事情:

buffer = ""
foreach x in range(0, length(nodeLabels)) |
buffer = buffer + nodeLabels[idx] + "-" + relLabels[idx] + "->")

这将是一种减少到您想要的字符串的方法。您不能使用 reduce 函数,因为它没有为您提供获取集合中的索引的方法。这意味着您可以迭代其中一个集合,但不能同时迭代另一个集合。这个 FOREACH 伪代码是行不通的,因为 FOREACH 的第二部分我相信必须是对图的变异操作,你不能只用它来累加一个字符串,就像我在这里所做的那样,或者像 extract 函数那样。

据我所知,您可能有点被困在这里。希望有人能证明我错了——我不是 100% 确定。

最后的另一种方法是,如果有一个提取节点/关系对的路径函数,而不仅仅是 nodes()relationships()就像我在上面使用的那样单独使用它们,那么您可以使用该函数迭代一个集合,而不是洗牌两个集合,因为我上面的代码尝试但失败了。可悲的是,我不认为有任何这样的路径功能,所以这就是我认为你可能陷入困境的更多原因。

现在,实际上,您始终可以用 Java 或其他某种语言执行此查询,返回路径,然后使用您想要构建此字符串的任何编程语言的全部功能。但是纯密码?我很怀疑。

关于neo4j - 从图形中获取文本格式的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26523029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com