标签: neo4j

图数据库如何在内部存储其数据?

我的问题是从开发人员的角度来看(不是特别尊重用户),可能有些混乱.
我想知道节点和关系的结构如何在逻辑上存储在数据库中.就像,当我说我有bla bla信息时.哪里? - 然后答案是,在BOOK中,以网格形式或页面上的线条.在RDBMS的情况下,数据以网格/表格格式存储.但我无法理解图形如何存储在Neo4j/graph数据库中.
我正在使用neo4j客户端2.0.

neo4j graph-databases

1
推荐指数
1
解决办法
1393
查看次数

neo4j 2.0无法将事务标记为仅回滚

我正在构建一个独立的java应用程序,并在嵌入式模式下使用neo4j与Cypher存储信息.我已经构建了这个函数,用于一般目的:

private ExecutionResult runCypher(String query)
{
    Transaction tx = service.beginTx();
    ExecutionResult result = null;
    boolean success = true;

    try
    {
        result = engine.execute(query);
    }
    catch(Exception e)
    {
        System.out.println(e.getMessage());
        success = false;
    }
    finally
    {
        if(success) tx.success();
        else        tx.failure();
    }

    tx.close();

    return result;
}
Run Code Online (Sandbox Code Playgroud)

问题是我经常遇到这个错误:

Exception in thread "main" org.neo4j.graphdb.TransactionFailureException: Failed to    mark transaction as rollback only.
at org.neo4j.kernel.TopLevelTransaction.markAsRollbackOnly(TopLevelTransaction.java:97)
at org.neo4j.kernel.TopLevelTransaction.failure(TopLevelTransaction.java:86)
Run Code Online (Sandbox Code Playgroud)

如果我修改finally子句,并且总是去tx.failure(),那么没有问题.这是怎么回事?

java neo4j cypher

1
推荐指数
1
解决办法
1571
查看次数

在赌场的24/7员工名册的数据库模型

我们目前使用基于笔/纸的名册来管理赌场的桌面游戏工作人员.每行都是一名员工,每列是一个20分钟的时间段,每个单元格代表员工分配到的表,或者他们已被分配到休息时间.员工轮班的开始和结束时间与他们可以处理的游戏/技能不同.我们需要保留7年的名册副本,纸张相当容易,我想开发一个数字应用程序,并且很难将数据存储在数据库中进行存档.

我很擅长使用数据库,我想我理解如何为像neo4j这样的图形数据库建模数据,但是在处理时间时遇到了困难.我试图了解像MySQL这样的RDBMS数据库,下面是我认为数据应该建模的方式.请指出如果我走向错误的方向或者更合适的数据库类型,我们将不胜感激!

基本数据
以下是在我们考虑调度/时间之前要使用的一些基本数据.

员工
- 身份证号码
- 姓名
- 技能(二十一点,百家乐,轮盘等)


- 身份证号码
- 技能/类型(只能是一项技能)

将名册数据存储为像JSON这样的文件可能更好吗?时间敏感数据不会是一个问题.使用数据库进行数字化的好处是查询,这些可以帮助协助人为错误很常见的耗时任务.

可能的查询
注意:轮班的工作人员要么在休息时间要么在场上(分配到桌子上),技能根据难度来学习有主要或次要类型.

  • 80分钟以上的工作人员在场?(他们应该休息一下)
  • 我可以根据他们的技能分配哪些开放表格?
  • 我需要一名具有百家乐技能但尚未被分配到百家乐桌的员工.
  • 在这段时间里,这张桌子上有哪些员工?
  • 这个员工现在在哪里?
  • 谁现在正在轮班?
  • 轮班的工作人员可以处理二十一点?
  • 有多少员工有3项主要技能?
  • 哪些员工至少有3个月的百家乐技能?

这些查询也可以按字母顺序或时间,技能等进行排序.

我很确定我知道如何使用cypher为neo4j执行这些查询,前提是我正确地建模数据.我不熟悉SQL查询,我读过它可能会有点复杂,具体取决于查询和结构.

-------------------------------------------------- --------------------------------------

MYSQL具体

员工表可以包含其ID号和名称等属性,但我是否正确,对于他们的技能和班次,这些将是通过唯一整数引用员工的单独表(我认为这称为外键?).

另一个表可以存储游戏表,这些表将具有它们自己的ID并且引用具有外键的技能/游戏类型.

要记录笔/纸名册等数据,每天都可以有一个表格,其中列从0000开始增加20,一直到2340?在时间列之前,我可以为员工提供一个用其外键表示的员工,时间列将具有指定游戏表的外键,行数据必然包含许多未填充的单元格员工轮班不会是24/7.如果我使用外键来引用游戏桌,那么当员工休息时,我现在遇到了问题?除非我对待说第一个游戏桌入口作为休息?

我可能需要进一步复杂化,管理层会随着时间的推移尝试不同的游戏桌面布局,一些游戏桌可以从说到二十一点转换为百家乐.这肯定会在7年多的时间内发生,我是想创建新的游戏表条目还是添加一列来使用外键并参考一个新的表来存储游戏类型在一段时间内的历史记录?员工也将学习在他们的职业生涯中处理新游戏,很少他们可能也会删除技能.

-------------------------------------------------- --------------------------------------

Neo4j具体

有了这个数据,我会有一个Employee和一个表节点,它们有"isA"关系边缘映射到实际的员工或表吗?我想象两种类型的技能我最好用Skill节点建立关系吗?:Blackjack-> isA-> Skill,Employee-> hasSkill-> Blackjack,Table-> typeIs-> Blackjack?

TIME
当我希望这个数据库现在可以使用时间轴时,我觉得很困难.我遇到了以下有关时间连接节点的建议:

  • Unix Epoch似乎是一个常见的推荐?
  • 将节点连接到年/月/日图表?
  • Lucene时间表?(我不太了解这个或如何使用它,已经看到一些提到它)

以及时间和数据如何相关的一些案例:

  • 工作人员每周都有不同的日期和开始/结束时间,这可能是属性{shiftStart,shiftEnd,actualStart,actualEnd}的班次节点,工作人员可能会迟到或在轮班期间生病.这是将每个班次与员工联系起来的正确方法吗?雇员(节点) - >移(groupNode) - >移(节点)

  • 表格和工作人员可能会修改技能数据,存档数据可能是一个问题,我认为解决方案是在与技能的关系上有时间属性?

  • 我们全天打开和关闭表格,每个表格每天都有开放/关闭时间,这可能会在一个月内根据管理层的需要而变化,此外时间也不严格,由于各种原因,经理可能会打开或关闭表格在转变期间.表节点的打开/关闭状态可能只与轮班期间的查询相关,这让我感到困惑,因为我想要查询但是随着时间的推移存档它可能没有意义?

我在查询时无法确定何时使用节点或向节点添加属性.对于一个员工,他们有一个姓名和身份证号码,如果我想通过他们的身份证号码找到一个员工,那么将它作为自己的节点更好吗?它会更直接,而不是通过所有员工获取该唯一ID号.

我最近也遇到过标签,我可以理解这些对于键入员工和表节点而不是将它们分组到节点下是有用的.随着员工的轮班,我认为应该继续与轮班节点分组,如果我要为在一段时间内轮班工作的员工进行密码查询,则标签可能是适当的,但是应该将其应用于各个班次节点或者转移链接回员工的组节点?我可能需要为各个移位节点或与移位组节点的关系添加属性?我不确定是否应该有一个移位组节点,我假设减少连接到员工节点的边缘对查询来说是最佳的.

-------------------------------------------------- --------------------------------------

如果有任何很好的资源我可以了解数据库开发是否很好,那里有太多的信息和选项,很难知道从什么开始.谢谢你的时间 :)

mysql sql database rostering neo4j

1
推荐指数
1
解决办法
1930
查看次数

Neo4j/Indexed属性VS创建不同的节点

我们假设这个用例:

"获取所有传递的事件2013/05/12 20:002013/05/14 21:00".

实现这种情况下,Neo4j的第一种方式是使索引的属性:
事件(startAt:...,ENDAT:...) (startAtendAt被索引)

这将导致扫描具有与实际查询相对应的属性的所有事件.

我刚读过的其他方式:

在此输入图像描述

问题是:在这种情况下,节点遍历在性能方面要好于处理日期的索引属性吗?

neo4j graph-databases cypher

1
推荐指数
2
解决办法
359
查看次数

按ID获取特定节点?

这听起来太愚蠢但我无法弄清楚如何获得ID为15的特定节点

这些都是我尝试过的

match (n) where n.id=15 return n

MATCH (n { id:15 }) return n
Run Code Online (Sandbox Code Playgroud)

neo4j cypher

1
推荐指数
1
解决办法
72
查看次数

铸造未知类型的节点

在使用Neo4j时,我能够创建带有标签的节点数组,然后在这些节点之间创建关系.标签基本上是我的POCO的映射(Dog标签与C#中的Dog POCO有关),这些POCO是从一个只包含ID属性的简单基础POCO实现的.

当我知道要检索的节点的类型/标签时,我能够使用node.As <T>语法在return语句中转换它.但是,当执行诸如遍历节点之间的路径之类的操作时,我将不知道我正在遍历的节点的类型.虽然在技术上可以将节点转换为我的POCO实现的基本类型,但是我会丢失特定于超类的所有属性.

关于如何开始使用这个的任何想法?

图形

c# neo4j neo4jclient

1
推荐指数
1
解决办法
1105
查看次数

Cypher /阻止shortestPath函数来检索不涉及至少一个遍历关系的节点

关于cyper请求的摘录:(假设element在整个请求中是已知的节点变量)

MATCH p = shortestPath(element-[:LINKS*..3]-(user))
RETURN length(p)
Run Code Online (Sandbox Code Playgroud)

假设一个element可能是a user,我怎么能阻止在结果中检索element代表用户本身?

如果我们可以这样做会很酷:

MATCH p = shortestPath(element-[:LINKS*1..3]-(user))
RETURN length(p)
Run Code Online (Sandbox Code Playgroud)

但它导致了这个错误:

shortestPath(...) does not support a minimal length
Run Code Online (Sandbox Code Playgroud)

实现这一伎俩最有效的方法是什么?

neo4j graph-databases cypher

1
推荐指数
1
解决办法
207
查看次数

从PHP获取JSON值

全部,我收到了NEO4J的JSON回复:

Array
(
    [columns] => Array
        (
            [0] => n
        )

    [data] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [outgoing_relationships] => http://localhost:7474/db/data/node/1/relationships/out
                            [labels] => http://localhost:7474/db/data/node/1/labels
                            [data] => Array
                                (
                                    [position] => Developer
                                    [awesome] => 1
                                    [name] => Michael
                                    [children] => 3
                                )

                            [traverse] => http://localhost:7474/db/data/node/1/traverse/{returnType}
                            [all_typed_relationships] => http://localhost:7474/db/data/node/1/relationships/all/{-list|&|types}
                            [property] => http://localhost:7474/db/data/node/1/properties/{key}
                            [self] => http://localhost:7474/db/data/node/1
                            [properties] => http://localhost:7474/db/data/node/1/properties
                            [outgoing_typed_relationships] => http://localhost:7474/db/data/node/1/relationships/out/{-list|&|types}
                            [incoming_relationships] => http://localhost:7474/db/data/node/1/relationships/in
                            [extensions] => Array
                                (
                                )

                            [create_relationship] => http://localhost:7474/db/data/node/1/relationships
                            [paged_traverse] => http://localhost:7474/db/data/node/1/paged/traverse/{returnType}{?pageSize,leaseTime}
                            [all_relationships] => …
Run Code Online (Sandbox Code Playgroud)

php arrays json function neo4j

1
推荐指数
1
解决办法
126
查看次数

Neo4j匹配节点属性或关系属性

我正在尝试编写一个返回与节点属性或关系属性匹配的节点的查询.

例如,如果关系属性状态为"good",我想要name属性为George OR的所有节点.我有两个查询将获取每个节点:

MATCH (n) where n.name = 'George' return n

MATCH (n)-[r]-() where r.status = 'good' return n 
Run Code Online (Sandbox Code Playgroud)

我可以编写一个简单的查询来获得这些组合结果吗?我以为我可以使用这个可选查询(下面),但我似乎误解了可选的匹配子句,因为我只从第一个查询中获取节点.

MATCH (n) where n.name = 'George' 
Optional MATCH (n)-[r]-() where r.status = 'good' return distinct n 
Run Code Online (Sandbox Code Playgroud)

properties match relationship neo4j cypher

1
推荐指数
1
解决办法
7112
查看次数

Neo4j使用当前属性值的正则表达式重命名属性

从我的研究(很多谷歌搜索),我看不出这是可能的,但我认为仍然值得问.我有很多节点,如:

(org:Organization {name: "Organization 1234"})
Run Code Online (Sandbox Code Playgroud)

其中1234可以是任何非负整数.

为了更新数据库以使用新的API,我想重命名集合中的每一个,以便结果看起来像:

(org:Organization {name: "Org_1234"})
Run Code Online (Sandbox Code Playgroud)

所以,我需要在当前属性上使用[0-9] +正则表达式匹配来混搭Org_.

真的,我甚至不知道从哪里开始.我在文档中看到的只是正则表达式可以用作WHERE子句(WHERE n.property =~ {regex})中的谓词.有没有一种方法只使用Cypher,因为我没有使用Java库?

neo4j cypher

1
推荐指数
1
解决办法
616
查看次数