我发现关系数据库非常适合Clojure,因为set函数(project/join/union等)很好地映射到数据库模式,使Clojure几乎完全适合与数据库一起使用.
我想知道Clojure如何适应像Neo4j这样的图形数据库呢?
我有一个简单的设置,遇到一个令人费解的(至少对我来说)问题:
我有三个相互关联的pojos:
@NodeEntity
public class Unit {
@GraphId Long nodeId;
@Indexed int type;
String description;
}
@NodeEntity
public class User {
@GraphId Long nodeId;
@RelatedTo(type="user", direction = Direction.INCOMING)
@Fetch private Iterable<Worker> worker;
@Fetch Unit currentUnit;
String name;
}
@NodeEntity
public class Worker {
@GraphId Long nodeId;
@Fetch User user;
@Fetch Unit unit;
String description;
}
Run Code Online (Sandbox Code Playgroud)
所以你有User-Worker-Unit有一个"currentunit",它在用户中标记允许直接跳转到"当前单位".每个用户可以有多个工作人员,但只有一个工作人员被分配到一个单元(一个单元可以有多个工作人员).
我想知道的是如何控制"User.worker"上的@Fetch注释.我实际上希望这只在需要的时候加盖,因为大多数时候我只和"工人"一起工作.
我浏览了http://static.springsource.org/spring-data/data-neo4j/docs/2.0.0.RELEASE/reference/html/,对我来说并不是很清楚:
从我的看法来看,这个构造只要我想要一个Worker就加载整个数据库,即使我大部分时间都不关心用户.
我发现的唯一解决方法是使用存储库并在需要时手动加载实体.
-------更新-------
我已经使用neo4j很长一段时间了,并找到了上述问题的解决方案,不需要一直调用fetch(因此不会加载整个图形).唯一的缺点:它是运行时方面:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import …Run Code Online (Sandbox Code Playgroud) 我从大学开始就一直在使用RDBMS,而且我真的在努力研究NoSQL数据库的基本概念......但我认为他们的概念非常酷.
我相信我理解以下内容(如果我错了,请纠正我,因为这些问题在我这里提出来了!):
如果这些都是真的,那么让我们将注意力转向Neo4j,这是一个"基于图形"的数据库.
仔细阅读该网站和PDF后,好像Neo4j的不仅是一个数据库,但它也提供了一个Java API,基本上取代了传统ORM工具如Hibernate的需要.
所以,我的最后一个问题实际上是要求澄清/确认最后一个断言,具体来说:
提前致谢!
我正在开始一个新项目,我正在寻找使用MongoDB作为文档存储工具和Neo4j作为映射文档之间关系的机制,然后我想通过rest API公开我的查询结果.人们会说这样做的优点和缺点是什么?是否有更好的方法可以使用不同的NoSQL文档存储来实现这一目标?有没有人可以在网上找到有人试图做类似事情的例子?
当您使用新的Windows安装程序安装1.9.4时,从何处启动Neo4j-Shell(之前在bin中找到)?
据我所知,Neo4j(ID(node))给出的ID 不稳定,行为有点像SQL中的行号.由于ID主要用于SQL中的关系,并且这些ID很容易在Neo4j中建模,因此ID似乎没有多大用处,但是如何解决特定节点的检索?拥有一个REST API,它应该为每个节点(例如/api/concept/23)提供唯一的路由,这似乎是Web应用程序的一个非常标准的案例.但尽管它是如此根本,我找到的唯一可行的方法是通过
// get unique id
MERGE (id:UniqueId{name:'Person'})
ON CREATE SET id.count = 1
ON MATCH SET id.count = id.count + 1
WITH id.count AS uid
// create Person node
CREATE (p:Person{id:uid,firstName:'Gabriel',lastName:'Smith'})
RETURN p AS person
Run Code Online (Sandbox Code Playgroud)
资料来源: http ://www.neo4j.org/graphgist?8012859
真的没有更简单的方法,如果没有,是否有一个特殊的原因呢?在Neo4j的背景下,我的方法是反模式吗?
我是Neo4J的新手,过去几天一直在学习Cypher查询语言.
我意识到我可以这样写我的查询......
MATCH (b:Beverage)<-[:likes]-(p:Person)-[:likes]->(r:Restaurant)
WHERE b.name = 'Beer' and r.name = 'KFC'
RETURN p.name
Run Code Online (Sandbox Code Playgroud)
......或者像这样......
MATCH (b:Beverage{name:'Beer'})<-[:likes]-(p:Person)-[:likes]->(r:Restaurant{name:'KFC'})
RETURN p.name
Run Code Online (Sandbox Code Playgroud)
哪种方法在性能方面更好?为什么?
谢谢.
是否有neo4j的GUI构建器?我希望能够通过单击可视化中的节点,在gui环境中快速添加新节点,设置标签,设置属性和关系.我搜索过,但一无所获.谢谢.
DETACH DELETE在Neo4j 2.3.x中添加新Cypher运算符的行为和目的是什么?