You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Neo4j Cypher对比节点链并查询指定单词的最大10节点范围链片段

Alright, let's tackle these two Neo4j tasks step by step. I'll provide practical Cypher queries and explain how they work so you can adapt them to your specific graph structure.

1. Comparing Node Chains with Cypher

First, I’ll assume your graph uses :Word nodes connected by :NEXT relationships to represent word chains (adjust labels/relationship types if yours are different). Here are two common ways to compare chains:

Option 1: Compare Word Sequences (Common/Unique Words)

This query extracts word lists from two target chains and returns their overlaps and differences:

// Match the two chains you want to compare (use your own identifier, like chainId)
MATCH path1 = (start1:Word)-[:NEXT*]->(end1:Word) 
WHERE start1.chainId = 'CHAIN_001'

MATCH path2 = (start2:Word)-[:NEXT*]->(end2:Word) 
WHERE start2.chainId = 'CHAIN_002'

// Convert paths to word lists and calculate comparisons
WITH 
  [node IN nodes(path1) | node.value] AS chain1_words,
  [node IN nodes(path2) | node.value] AS chain2_words
RETURN
  chain1_words AS full_chain_1,
  chain2_words AS full_chain_2,
  [w IN chain1_words WHERE w IN chain2_words] AS common_words,
  [w IN chain1_words WHERE NOT w IN chain2_words] AS unique_to_chain1,
  [w IN chain2_words WHERE NOT w IN chain1_words] AS unique_to_chain2

How it works:

  • We first match the full paths of the two chains using a unique identifier (like chainId on the starting node).
  • The nodes() function extracts all nodes in each path, which we convert to a list of word values with a list comprehension.
  • Finally, we compare the lists to show shared words and words unique to each chain.

Option 2: Find Longest Common Subchain (Requires APOC)

If you need to find the longest consecutive sequence of words shared between two chains, use the APOC library's text functions:

// Match the two target chains
MATCH path1 = (start1:Word)-[:NEXT*]->(end1:Word) 
WHERE start1.chainId = 'CHAIN_001'

MATCH path2 = (start2:Word)-[:NEXT*]->(end2:Word) 
WHERE start2.chainId = 'CHAIN_002'

// Convert chains to space-separated strings
WITH 
  REDUCE(str = '', node IN nodes(path1) | str + ' ' + node.value) AS chain1_str,
  REDUCE(str = '', node IN nodes(path2) | str + ' ' + node.value) AS chain2_str

// Get the longest common substring (which maps to the longest common subchain)
RETURN apoc.text.longestCommonSubstring(chain1_str, chain2_str) AS longest_common_subchain

Note:

You’ll need to have the APOC Extended library installed for this to work. The REDUCE function builds a single string from each chain, and apoc.text.longestCommonSubstring finds the longest shared sequence.


2. Querying Chain Fragments with a Target Word (Within 10 Nodes)

To find all subchains where your target word appears, and the entire fragment is at most 10 words long, use one of these approaches:

Option 1: Simple Matching of Short Fragments Containing the Target

This query matches all subchains of length ≤10 that include your target word:

// Replace 'example' with your target word
MATCH subpath = (a:Word)-[:NEXT*..9]->(b:Word)
WHERE 'example' IN [node IN nodes(subpath) | node.value]
  AND length(nodes(subpath)) <= 10

// Return distinct fragments to avoid duplicates
RETURN DISTINCT 
  subpath AS chain_fragment,
  [node IN nodes(subpath) | node.value] AS fragment_words

How it works:

  • [:NEXT*..9] matches paths with 0 to 9 relationships (so 1 to 10 nodes total).
  • The list comprehension checks if the target word is present in the subchain's nodes.
  • DISTINCT ensures we don’t return overlapping duplicate fragments.

Option 2: Focus on Fragments Centered Around the Target Word

If you want fragments where the target word is included, and the total length is ≤10 (e.g., up to 4 words before and 5 after, or vice versa), use this query to control the expansion:

// Replace 'example' with your target word
MATCH (target:Word) 
WHERE target.value = 'example'

// Expand forward up to 9 nodes, but cap total length at 10
MATCH forward_path = (target)-[:NEXT*0..9]->(end)
WITH target, end, length(nodes(forward_path)) AS forward_length

// Calculate max backward expansion to keep total nodes ≤10
MATCH backward_path = (target)<-[:NEXT*0..(9 - forward_length + 1)]-(start)

// Combine the backward and forward nodes into a single fragment
WITH start, end, nodes(backward_path) + tail(nodes(forward_path)) AS fragment_nodes
RETURN 
  fragment_nodes AS centered_fragment,
  [node IN fragment_nodes | node.value] AS fragment_words

How it works:

  • We first locate the target word node.
  • We expand forward from the target, then calculate how far we can expand backward without exceeding 10 total nodes.
  • tail(nodes(forward_path)) avoids duplicating the target node when combining the two paths.

内容的提问来源于stack exchange,提问作者Andreas Kuczera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:53:15