图结构数据库和 PHP
Posted
技术标签:
【中文标题】图结构数据库和 PHP【英文标题】:Graph-structured databases and Php 【发布时间】:2011-02-20 01:19:39 【问题描述】:我想使用一个使用 php 的图形数据库。你能指出一些关于从哪里开始的资源吗?那里有任何示例代码/教程吗?或者是否有任何其他方法可以在完全随机/抽象的情况下存储彼此相关的数据?
-
所需关系的非常抽象的例子:约翰与玛丽有关,都与学校有关,约翰很高,玛丽很矮,约翰有蓝眼睛,玛丽有绿眼睛,我想要查询哪些人与“矮”有关有绿眼睛并上学的人'->回答约翰
-
另一个例子:
TrackA -> ArtistA
-> ArtistB
-> AlbumA -----> [ label ]
-> AlbumB -----> [ A ]
-> TrackA:Remix
-> Genre:House
-> [ Album ] -----> [ label ]
TrackB -> [ C ] [ B ]
查询示例:
TrackB 更接近哪种类型?答案:House——因为和Album C有关,又和TrackA有关,又和Genre:House有关
获取 Label A 的所有 Genre:House 相关专辑:结果:AlbumA、AlbumB - 因为它们都有与 Genre:House 相关的 TrackA
-
这在 mysql 中是可能的,但它需要为每个项目设置一组固定的属性/列和一个复杂的非灵活查询,相反,我需要每个属性本身就是一个项目,而不是“属于”某物,与某事“相关”。
【问题讨论】:
“属于某物”和“与某物有关”(除了使用不同的词)有什么区别? @Joel L:我所说的归属是指一个项目所具有的属性,相关是项目如何相互关联,而不是一个是另一个的属性。就像曲目属于艺术家一样,但同一个曲目可以有多个艺术家。使用父/子方法,您需要将相同的子(轨道)复制到每个父(艺术家),并且轨道可以在多个专辑和多个标签中。如果不使用图表,您将如何描述这样的关系? 【参考方案1】:你也可以找到一个 Rexster 的 php 客户端:https://github.com/PommeVerte/rexpro-php
作为额外信息。 Rexster 可以从其他各种图形数据库(例如 Neo4j 和 OrientDb 等)加载图形。
【讨论】:
【参考方案2】:考虑到这个问题已经存在一年了,可能仍然有趣的是,您可以对每个支持 sparql 或类似语言的 rdf 数据存储进行这样的查询。
【讨论】:
【参考方案3】:还可以看看这篇关于 OrientDB 与 PHP 的使用的文章:http://www.odino.org/346/orientdb-the-graph-db-for-the-web
【讨论】:
【参考方案4】:我的建议是选择一个基于 Java 的图形数据库,例如 OrientDB 或 neo4j,然后通过 PHP/Java bridge 使用它。在不久的将来,neo4j(以及在某些时候 OrientDB 也会获得原生 php 支持,您可以用原生访问替换桥接器。
【讨论】:
【参考方案5】:为了使Neo4j 图形数据库可以从 PHP 中获得,正在进行一些工作,请参阅this wiki page 了解更多信息!关于如何将您的域建模为图形,user mailing list 往往非常棒。
更新:现在有一个简短的getting started blog post 用于 PHP neo4j REST 客户端。
【讨论】:
neo4j REST 客户端查询与 mysql 相比相当慢【参考方案6】:听起来你应该这样处理它:
1) 编写一个图形对象,让您可以按照自己的方式查询数据。
2) 为你的对象写一个持久层
3) 优化在图形对象中执行查询的调用,以便在适当时使用数据库调用(例如,如果您需要节省内存)。
【讨论】:
是的,这可能是一个解决方案,我在想是否已经有任何类可以解决这个问题,但目前图形结构似乎很少受到关注,你能找到的代码也很少.我想我将不得不发明***......【参考方案7】:这看起来像是一个语义网络问题。因此,您必须弄清楚如何将 PHP 和语义网结合使用。也许这个链接http://bnode.org/blog/2009/05/25/back-from-new-york-semantic-web-for-php-developers-trip 可以提供帮助?
【讨论】:
【参考方案8】:在我看来有点像“典型”Prolog 问题……这是一种与 PHP 完全不同的编程语言。但也许你可以使用 popen。
或者你定义一个列 [id, predicate, atom1, atom2] 的 SQL 表来存储“Mary has Green Eyes”的真实性:predicate = "has", atom1 = "Mary", atom2 = "Green Eyes ”。
现在您可以使用您选择的 SQL 连接和过滤谓词和属性。
【讨论】:
我认为每一种关系都需要一行,如果您处理大量数据,例如带有标签和作者、艺术家、流派和更多的关系? 是的,但是几乎每个图都倾向于在节点(“原子”)之间具有指数数量的边(“关系”),这使得解决图问题(特别是如果还使用水平分区)使用传统数据库要困难得多。以上是关于图结构数据库和 PHP的主要内容,如果未能解决你的问题,请参考以下文章