我想使用 cypher 来比较两个语义知识图,看看它们是否有共同的三元组。
MATCH (n1)-[r1]-(c1)
MATCH (n2)-[r2]-(c2)
WHERE r1.filePath = "../data/graph1.json"
AND r2.filePath = "../data/graph2.json"
AND n1 = n2
AND r1 = r2
AND c1 = c2
RETURN n1, n2, r1, r2, c1, c2
这两个图是在neo4j中加载的,区分它们的唯一方法是rel属性“filePath”。
这是正确的做法吗? 还有其他算法来搜索图之间的相似性吗?
您说“两个语义知识图”,这让我认为您有两个 Neo4j 数据库,但您的代码意味着您有一个图数据库,其中(可能)有两组不同的数据。我假设是后者。
您的代码不会按您预期的方式工作。通过说
r1 = r2
,您可以确定这些是完全相同的关系对象。您可能想要 type(r1) = type(r2)
,但最好指定为:
MATCH (n1)-[r1:MY_REL_TYPE]-(c1)
MATCH (n2)-[r2:MY_REL_TYPE]-(c2)
此外,说
n1 = n2
和 c1 = c2
意味着您正在寻找在它们之间具有两个具有不同属性的 MY_REL_TYPE 关系的节点。如果这就是你想要的,那就更简单了:
MATCH (n1)-[r1:MY_REL_TYPE]-(c1)
MATCH (n1)-[r2:MY_REL_TYPE]-(c1)
WHERE r1.filePath = "../data/graph1.json"
AND r2.filePath = "../data/graph2.json"
RETURN n1, r1, r2, c1
但是,如果 n1 和 n2 旨在成为单独的节点,您可能希望标签匹配:
MATCH (n1:MyNodeLabel)-[r1:MY_REL_TYPE]-(c1:MyOtherNodeLabel)
MATCH (n2:MyNodeLabel)-[r2:MY_REL_TYPE]-(c2:MyOtherNodeLabel)
WHERE r1.filePath = "../data/graph1.json"
AND r2.filePath = "../data/graph2.json"
RETURN n1, n2, r1, r2, c1, c2
最后,是的,有一些算法可以找到图形相似性,但我不确定这是你的目标,因为你想要匹配特定的东西,而不是整体图片。
希望有帮助。 :)