Neo4j中多域句/字图的最佳结构是什么?

时间:2016-02-21 17:30:34

标签: neo4j cypher graph-databases

我正在实现基于this paper的抽象摘要,我无法确定实现图的最佳方式,以便可以用于多域分析。让我们从Twitter开始作为示例域。

对于每条推文,每个句子都会这样绘制(例如:“@stackoverflow是获取帮助的好地方#graphsftw”):

(@stackoverflow)-[next]->(is)
-[next]->(a)
-[next]->(great)
-[next]->(place)
-[next]->(for)
-[next]->(getting)
-[next]->(help)
-[next]->(#graphsftw)

这将产生类似于论文中概述的图表:

opiniosis graph

要为每个单词创建一种域图层,我会将它们添加到图形中(包含诸如词性之类的属性):

MERGE (w:Word:TwitterWord {orth: "word" }) ON CREATE SET ... ON MATCH SET ...

在论文中,他们在每个单词{SID:PID}上设置了一个属性,它描述了单词(SID)的句子id以及句子中每个单词的位置(PID);所以在例句中,“@ stackoverflow”将具有{1:1}的属性,“是”将是{1:2},“#graphsftw”{1:9}等。每个后续对该词的引用另一个句子会在{SID:PID}属性数组中添加一个元素:[{1:x},{n:n}]。

似乎没有句子和位置信息作为每个节点的属性中包含的元素数组是有效的,尤其是在处理每个单词层内的多个单词域和子域时。

对于像Twitter这样的每个单词层或域,我想要做的是了解特定域/层实体(如提及和标签)周围发生的事情;在此示例中, @stackoverflow #graphsftw

在“Twitter”图层之上添加子域图层的最佳方式是什么,以便将不同的字词指向特定的域名实体,例如#hashtags和@mentions?我可以为每个子域使用单独的标签,例如:Word:TwitterWord:Stackoverflow,但这会给我的图表带来大量单独的标签。

如果我在节点属性数组中包含子域实体,那么遍历似乎会成为一个问题。

由于所有推文和提取的实体(如@mentions和#hashtags)在字图步骤之前被绘制为节点/顶点,因此我可以将#hashtags和@mentions的边缘转换为单词。或者,我可以将边缘从推文转换为具有实体作为边缘属性的单词。基本上,我正在寻找一种在存储和遍历方面“最便宜”的结构。

非常感谢有关如何构建此图表的任何输入。谢谢!

1 个答案:

答案 0 :(得分:1)

您还可以将域/位置放在关系上(也可以添加源ID)。

只要您的关系代表原始句子,OTOH您也可以推断出该信息。

然后,您可以动态聚合关系以计算优势,或者拥有单独的"复合"将所有其他人聚合成计数器或总和的关系。