最低的共同祖先,具有algo.shortestPath.stream和cypher投影

neo4j-desktop:1.2.2 ce neo4j-browser:3.2.24(p2neo v.4) APOC:3.5.0.5 图算法:3.5.11.0 GraphQL:3.5.0.4 图的大小:159760个节点,389554个关系

嗨, 我想找到两个单词的最低共同祖先(lca),因为我想根据他们的语义关系比较我的职业的相似性。

我有一个这样的图:

CREATE (profession_1:Profession {title: 'Goldsmith'})
CREATE (profession_2:Profession {title: 'Silversmith'})
CREATE (profession_3:Profession {title: 'Blacksmith'})
CREATE (profession_4:Profession {title: 'carpenter'})

CREATE (task_1:pa {id:'1',description: 'forge gold to necklace and ring'})
CREATE (task_2:pa {id:'2',description: 'mould silver to ring and finger ring'})
CREATE (task_3:pa {id:'3',description: 'forge iron to chain'})
CREATE (task_4:pa {id:'4',description: 'saw wood to board'})
CREATE (task_5:pa {id:'5',description: 'check gold'})
CREATE (task_6:pa {id:'6',description: 'check silver'})
CREATE (task_7:pa {id:'7',description: 'make furniture from wood'})

CREATE (GNROOT:Lexunit {lexunit_id: '1',orth_form: 'GNROOT',depth: 0})
CREATE (forge:Lexunit {lexunit_id: '2',orth_form: 'forge',depth: 3})
CREATE (mould:Lexunit {lexunit_id: '3',orth_form: 'mould',depth: 3})
CREATE (saw:Lexunit {lexunit_id: '4',orth_form: 'saw',depth: 3})
CREATE (gold:Lexunit {lexunit_id: '5',orth_form: 'gold',depth: 4})
CREATE (silver:Lexunit {lexunit_id: '6',orth_form: 'silver',depth: 4})
CREATE (iron:Lexunit {lexunit_id: '7',orth_form: 'iron',depth: 4})
CREATE (wood:Lexunit {lexunit_id: '8',orth_form: 'wood',depth: 2})
CREATE (necklace:Lexunit {lexunit_id: '9',orth_form: 'necklace',depth: 2})
CREATE (ring:Lexunit {lexunit_id: '10',orth_form: 'ring',depth: 2})
CREATE (chain:Lexunit {lexunit_id: '11',orth_form: 'chain',depth: 2})
CREATE (board:Lexunit {lexunit_id: '12',orth_form: 'board',depth: 2})
CREATE (cast:Lexunit {lexunit_id: '13',orth_form: 'cast',depth: 2})
CREATE (cut:Lexunit {lexunit_id: '14',orth_form: 'cut',depth: 2})
CREATE (make:Lexunit {lexunit_id: '15',orth_form: 'make',depth: 1})
CREATE (precious_metal:Lexunit {lexunit_id: '16',orth_form: 'precious metal',depth: 3})
CREATE (heavy_metal:Lexunit {lexunit_id: '17',orth_form: 'heavy metal',depth: 3})
CREATE (metal:Lexunit {lexunit_id: '18',orth_form: 'metal',depth: 2})
CREATE (ressource:Lexunit {lexunit_id: '19',orth_form: 'ressource',depth: 1})
CREATE (jewellery:Lexunit {lexunit_id: '20',orth_form: 'jewellery',depth: 1})
CREATE (string:Lexunit {lexunit_id: '21',orth_form: 'string',depth: 1})
CREATE (part_of_building:Lexunit {lexunit_id: '22',orth_form: 'part of building',depth: 1})
CREATE (finger_ring:Lexunit {lexunit_id: '23',orth_form: 'finger ring',depth: 3})
CREATE (check:Lexunit {lexunit_id: '24',orth_form: 'check',depth: 1})
CREATE (furniture:Lexunit {lexunit_id: '25',orth_form: 'furniture',depth: 1})

MERGE (profession_1)-[:HAS_PA]->(task_1)
MERGE (profession_2)-[:HAS_PA]->(task_2)
MERGE (profession_3)-[:HAS_PA]->(task_3)
MERGE (profession_4)-[:HAS_PA]->(task_4)
MERGE (profession_1)-[:HAS_PA]->(task_5)
MERGE (profession_2)-[:HAS_PA]->(task_6)
MERGE (profession_4)-[:HAS_PA]->(task_7)

MERGE (task_1)-[:HAS_ARB]->(forge)
MERGE (task_1)-[:HAS_MAT]->(gold)
MERGE (task_1)-[:HAS_PRO]->(necklace)
MERGE (task_1)-[:HAS_PRO]->(ring)

MERGE (task_2)-[:HAS_ARB]->(mould)
MERGE (task_2)-[:HAS_MAT]->(silver)
MERGE (task_2)-[:HAS_PRO]->(ring)
MERGE (task_2)-[:HAS_PRO]->(finger_ring)

MERGE (task_3)-[:HAS_ARB]->(forge)
MERGE (task_3)-[:HAS_MAT]->(iron)
MERGE (task_3)-[:HAS_PRO]->(chain)

MERGE (task_4)-[:HAS_ARB]->(saw)
MERGE (task_4)-[:HAS_MAT]->(wood)
MERGE (task_4)-[:HAS_PRO]->(board)

MERGE (task_5)-[:HAS_ARB]->(check)
MERGE (task_5)-[:HAS_MAT]->(gold)

MERGE (task_6)-[:HAS_ARB]->(check)
MERGE (task_6)-[:HAS_MAT]->(silver)

MERGE (task_7)-[:HAS_ARB]->(make)
MERGE (task_7)-[:HAS_MAT]->(wood)
MERGE (task_7)-[:HAS_PRO]->(furniture)

MERGE (forge)-[:HAS_hypernym]->(cast)
MERGE (mould)-[:HAS_hypernym]->(cast)
MERGE (saw)-[:HAS_hypernym]->(cut)
MERGE (cast)-[:HAS_hypernym]->(make)
MERGE (cut)-[:HAS_hypernym]->(make)
MERGE (make)-[:HAS_hypernym]->(GNROOT)
MERGE (gold)-[:HAS_hypernym]->(precious_metal)
MERGE (silver)-[:HAS_hypernym]->(precious_metal)
MERGE (iron)-[:HAS_hypernym]->(heavy_metal)
MERGE (precious_metal)-[:HAS_hypernym]->(metal)
MERGE (heavy_metal)-[:HAS_hypernym]->(metal)
MERGE (metal)-[:HAS_hypernym]->(ressource)
MERGE (wood)-[:HAS_hypernym]->(ressource)
MERGE (necklace)-[:HAS_hypernym]->(jewellery)
MERGE (ring)-[:HAS_hypernym]->(jewellery)
MERGE (finger_ring)-[:HAS_hypernym]->(ring)
MERGE (chain)-[:HAS_hypernym]->(string)
MERGE (board)-[:HAS_hypernym]->(part_of_building)
MERGE (jewellery)-[:HAS_hypernym]->(GNROOT)
MERGE (string)-[:HAS_hypernym]->(GNROOT)
MERGE (part_of_building)-[:HAS_hypernym]->(GNROOT)
MERGE (ressource)-[:HAS_hypernym]->(GNROOT)
MERGE (check)-[:HAS_hypernym]->(GNROOT)
MERGE (furniture)-[:HAS_hypernym]->(GNROOT)

简单匹配,例如: MATCH p = (n:Lexunit {orth_form: "mould"})-[:HAS_hypernym*]->(x)<-[:HAS_hypernym*]-(m:Lexunit {orth_form: "saw"}) RETURN x.depth 我的真实图形的性能必须很差,但是算法如:

MATCH aspaths = AllShortestPaths( (start:Lexunit{orth_form:'mould'})-[*]-(end:Lexunit{orth_form:'saw'}) )
WHERE ALL (r in relationships(aspaths) WHERE type(r) = 'HAS_hypernym')
RETURN aspaths

有可能他们没有找到最低的共同祖先,而只是找到一个共同的亲戚,因为这种关系必须直接针对祖先 (开始)-[rel]->(lca)

MATCH (start:Lexunit{orth_form:'mould'}),(end:Lexunit{orth_form:'saw'})
CALL algo.shortestPath.stream(start,end,'distance',{
nodeQuery:'MATCH(n:Lexunit) RETURN id(n) as id',relationshipQuery:'MATCH(n:Lexunit)-[:HAS_hypernym*]->(x)<-[:HAS_hypernym*]-(m:Lexunit) RETURN id(n) as source,id(m) as target,count(*) as weight',graph:'cypher'})
YIELD nodeId,cost
RETURN algo.asnode(nodeId).orth_form AS name,cost

...但是它仅向我显示了开始节点和结束节点:

“名称”,“费用”

“模具”,0.0

“ saw”,1.0

在此感谢您的帮助。

上次查询的个人资料:

enter image description here

谢谢!

yaozhiqin619 回答:最低的共同祖先,具有algo.shortestPath.stream和cypher投影

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3139733.html

大家都在问