在 Neo4j 中搜索从所有节点到所有节点的匹配项
Searching for matches from all nodes to all nodes in Neo4j
我有一组节点代表文件系统位置之间的 links。我可以加载所有节点,并尝试通过在每个节点中查找目标目录和源目录之间的匹配项来 link 将它们放在一起。
伪代码查询:
For all Interface nodes in Neo4j,
search all other nodes for where other.sourcedir = this.destdir.
If a match is found, create a SENDS_TO relationship from A to B.
天真的查询:
MATCH (a:Interface), (b:Interface) WHERE a.destdir == b.sourcedir 合并 (a)-[r:SENDS_TO]->(b)
当我 运行 该查询时,Neo4j 似乎进入了一个无限循环,我在 10 分钟后终止了该循环。
您可以试试这个:
MATCH (a:Interface)
with a
MATCH (b:Interface)
WHERE a.destdir == b.sourcedir and a <> b
MERGE (a)-[:SENDS_TO->(b);
这可能会执行得更好,但是您 运行 的查询会将每个接口与其他每个接口进行比较。所以对我来说似乎是 O(n^2),如果你有 80 个 frazillion 节点,它会很慢。在 运行 之前,您可能需要确保 destdir
和 sourcedir
.
上存在索引
我有一组节点代表文件系统位置之间的 links。我可以加载所有节点,并尝试通过在每个节点中查找目标目录和源目录之间的匹配项来 link 将它们放在一起。
伪代码查询:
For all Interface nodes in Neo4j,
search all other nodes for where other.sourcedir = this.destdir.
If a match is found, create a SENDS_TO relationship from A to B.
天真的查询: MATCH (a:Interface), (b:Interface) WHERE a.destdir == b.sourcedir 合并 (a)-[r:SENDS_TO]->(b)
当我 运行 该查询时,Neo4j 似乎进入了一个无限循环,我在 10 分钟后终止了该循环。
您可以试试这个:
MATCH (a:Interface)
with a
MATCH (b:Interface)
WHERE a.destdir == b.sourcedir and a <> b
MERGE (a)-[:SENDS_TO->(b);
这可能会执行得更好,但是您 运行 的查询会将每个接口与其他每个接口进行比较。所以对我来说似乎是 O(n^2),如果你有 80 个 frazillion 节点,它会很慢。在 运行 之前,您可能需要确保 destdir
和 sourcedir
.